GO : fatal error: all goroutines are asleep - deadlock!

代码如下

func main() {
        ch := make(chan int)
        go fmt.Println(<- ch)
        ch <- 2
        fmt.Println("end procc")
}

错误提示

 fatal error: all goroutines are asleep - deadlock!
 此时也没有在同一个 goroutine中对 ch 进行读写 这么就产生了死锁??
 

我的理解

goroutine: 如果在方法或者函数调用前添加go关键字之后,
就会开启一个goroutine来执行这个代码块. 主 goroutine 继续自己的工作而不被阻塞.

在这里创建一个没有缓冲的 channel; go fmt.Println(<-ch) 语句执行后就会创建一个新的 goroutine 来执行 fmt.Println(<-ch) 这条语句,
当执行 <-ch 由于ch的没有内容,所以会阻塞这个 新的goroutine;
此时 main goroutine 继续执行 ch <-2 这条语句;
当执行这条语句时因为在 新创建的goroutine中一直在等待读取ch内容.此时main goroutine 只要往 ch中写入内容即可,不会被阻塞; 可为什么 产生死锁????

如果把 go fmt.Println(<- ch) 换成下面形式就没有问题

go func(){
          fmt.Println(<- ch)
          }()

觉得他们作用都是一样的, 都是函数调用, 区别是func(){}()是匿名函数而fmt.Println()也是fmt包中的函数

期待的回答

说一下你的理解,感谢在先.

The same question is here : deadlock-in-function-which-has-a-channel-parameter

阅读 2k
1 个回答

你换成

go func(arg){
          fmt.Println(arg)
          }(<-ch)

也会死锁。
为什么呢。因为<-ch作为goroutine的参数,需要先获取。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题