为了账号安全,请及时绑定邮箱和手机立即绑定

重用 Go 通道导致死锁

重用 Go 通道导致死锁

Go
慕容3067478 2021-06-23 21:01:54
我是新手golang(具有Java并发背景)。考虑一下代码的和平:package mainimport "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 +0x90exit status 2我知道,添加另一条go sendenum(0, c)语句可以解决问题,...但是当与凡僵局发生了什么?
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

收到 0 后,main继续等待接收端的c另一个值到达(放入y变量),但它永远不会,因为运行的 goroutinemain是唯一剩下的。

当您添加另一个 时go sendenum(0, c),它实际上在第二个通道接收时获得一个值,将其放入y变量中,打印xy输出,程序成功完成。


查看完整回答
反对 回复 2021-06-28
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

并不是说“重用”频道是个问题。这只是一个简单的死锁发生,因为代码规定了两次读取,但只有一次写入同一个通道。第二次读取永远不会发生,因此会出现死锁。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信