0

我是新手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)语句可以解决问题,...但是

僵局何时何地发生?

4

2 回答 2

4

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

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

于 2013-09-04T18:40:04.140 回答
0

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

于 2013-09-04T20:04:11.227 回答