重用Go通道会导致死锁

时间:2013-09-04 18:27:42

标签: concurrency go channel

我是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)语句会解决问题,但是

哪里发生了死锁?

2 个答案:

答案 0 :(得分:4)

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

当您添加其他go sendenum(0, c)时,它实际上会获得第二个频道接收的值,将其放入y变量,打印xy并且程序成功完成。

答案 1 :(得分:0)

不是&#34;重复使用&#34;渠道是个问题。这只是一个简单的死锁,因为代码规定了两个读取,但只有一个写入同一个通道。第二次读取永远不会发生,因此陷入僵局。