我是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)
语句会解决问题,但是
当和哪里发生了死锁?
答案 0 :(得分:4)
收到0之后,main
继续等待c
的接收端等待另一个值到达(放入y
变量),但它永远不会,因为goroutine跑main
是唯一剩下的生活。
当您添加其他go sendenum(0, c)
时,它实际上会获得第二个频道接收的值,将其放入y
变量,打印x
和y
并且程序成功完成。
答案 1 :(得分:0)
不是&#34;重复使用&#34;渠道是个问题。这只是一个简单的死锁,因为代码规定了两个读取,但只有一个写入同一个通道。第二次读取永远不会发生,因此陷入僵局。