gpt4 book ai didi

go - 将例程与 channel 一起使用时出现死锁问题

转载 作者:IT王子 更新时间:2023-10-29 01:56:56 26 4
gpt4 key购买 nike

我在将 Go 例程与 channel 一起使用时遇到问题。代码如下所示:

func main() {
c := make(chan int)
var wg sync.WaitGroup

wg.Add(1)
go func (c chan int, x int) {
c <- x
fmt.Println(x)
close(c)

defer wg.Done()
}(c,10)

wg.Wait()
}

运行代码时我得到这个错误:

fatal error: all goroutines are asleep - deadlock!

我不明白为什么会出现这个问题。请帮助我理解

最佳答案

您的示例中有 2 个 goroutine:运行 main() 函数的主 goroutine,以及您在其中启动的另一个 goroutine。主 goroutine 等待另一个 goroutine 完成(调用 wg.Done()),其他 goroutine 阻塞在它试图在 channel c 上发送值的行中>。由于没有人从那个 channel 接收数据,并且因为那个 channel 是无缓冲的,所以这个 goroutine 永远不会前进,所以你所有的 2 个 goroutine 将永远阻塞。

请注意,defer wg.Done() 应该是 goroutine 中的第一条语句。如果是最后一个,defer 不会有任何不同。

如果 channel 的缓冲区至少为 1,则发送操作可以继续:

c := make(chan int, 1)

输出将是(在 Go Playground 上尝试):

10

如果我们让 channel 不带缓冲,则必须有另一个 goroutine 从 channel 接收数据,例如:

wg.Add(1)
go func() {
defer wg.Done()
x := <-c
fmt.Println("Received:", x)
}()

然后输出将是(在 Go Playground 上尝试):

10
Received: 10

关于go - 将例程与 channel 一起使用时出现死锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51357361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com