Concurrency 重用Go通道会导致死锁
我是新来的Concurrency 重用Go通道会导致死锁,concurrency,go,channel,Concurrency,Go,Channel,我是新来的golang(有Javaconcurrency后台)。考虑代码的和平: 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) } 我知道,添加另一个go s
golang
(有Java
concurrency后台)。考虑代码的和平:
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)
}
我知道,添加另一个go sendenum(0,c)
语句可以解决这个问题。。。但是
死锁发生在何时和何地?在它收到0后,
main
继续等待c
的接收端,等待另一个值到达(放入y
变量),但它永远不会,因为运行main
的goroutine是唯一存活的
当您添加另一个
go sendenum(0,c)
时,它实际上会在第二个通道接收上获取一个值,将其放入y
变量,打印出x
和y
,程序成功完成。在它接收到0之后,main
一直在c
的接收端等待另一个值到达(放入y
变量),但它永远不会到达,因为运行main
的goroutine是唯一还活着的
当您添加另一个go sendenum(0,c)
时,它实际上会在第二个通道接收时获取一个值,将其放入y
变量,打印出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