重用 Go 通道导致死锁

我是新手golang(具有Java并发背景)。考虑一下代码的和平:


package main


import "fmt"


func sendenum(num int, c chan int) {

    c <- num

}


func main() {

    c := make(chan int)

    go sendenum(0, c)

    x, y := <-c, <-c

    fmt.Println(x, y)

}

当我运行此代码时,出现此错误


fatal error: all goroutines are asleep - deadlock!


goroutine 1 [chan receive]:

main.main()

    /home/tarrsalah/src/go/src/github.com/tarrsalah/stackoverflow/chan_dead_lock.go:12 +0x90

exit status 2

我知道,添加另一条go sendenum(0, c)语句可以解决问题,...但是


当与凡僵局发生了什么?


慕容3067478
浏览 137回答 2
2回答

梵蒂冈之花

收到 0 后,main继续等待接收端的c另一个值到达(放入y变量),但它永远不会,因为运行的 goroutinemain是唯一剩下的。当您添加另一个 时go sendenum(0, c),它实际上在第二个通道接收时获得一个值,将其放入y变量中,打印x并y输出,程序成功完成。

胡子哥哥

并不是说“重用”频道是个问题。这只是一个简单的死锁发生,因为代码规定了两次读取,但只有一次写入同一个通道。第二次读取永远不会发生,因此会出现死锁。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go