golang并发死锁问题

问题描述 投票:0回答:1

在流程的一部分中,我创建了一个缓冲通道。在 doWork 函数内部,有时需要再次执行自身。然而,下面的代码会导致“所有 goroutine 都在睡觉 - 死锁!”错误,我很难理解为什么会发生这种情况。

如何正确实现这里的并发,以及导致死锁问题的原因是什么?

提前致谢!

package main

import (
    "errors"
    "fmt"
    "log/slog"
    "runtime/debug"
    "time"
)

func main() {
    signal := make(chan bool, 2)

    go func() {
        slog.Default().Info("worker started")

        for s := range signal {
            if s {
                doWork(signal)
            }
        }
        slog.Default().Info("worker stopped")

    }()
    for {
        scan(signal)
    }
}

func doWork(signal chan bool) {
    fmt.Println("work started")
    signal <- true
    time.Sleep(2 * time.Second)
    fmt.Println("work finished")
}
go concurrency channel goroutine
1个回答
0
投票

doWork 中的通道阻塞:当 doWork 运行时,它会尝试用 signal 发送一个真值到信号通道 <- true. This blocks if there is no available space in the channel buffer. This will cause the gorouting to block and cause the deadlock.

© www.soinside.com 2019 - 2024. All rights reserved.