tar*_*lah 0 concurrency channel 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)
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我收到此错误
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
Run Code Online (Sandbox Code Playgroud)
我知道,添加另一条go sendenum(0, c)
语句可以解决问题,...但是
僵局何时何地发生?
当它收到 0 后,main
继续在接收端等待c
另一个值到达(放入变量中y
),但它永远不会,因为正在运行的 goroutinemain
是唯一剩下的存活的。
当您添加另一个 时go sendenum(0, c)
,它实际上在第二个通道接收上获取一个值,将其放入y
变量中,打印x
并y
输出,程序成功完成。