go deadlock

原文地址:go deadlock作者:funkygao
  1 package main
  2 
  3 func main() {
  4     ch:= make(chan int)
  5     ch<- 5
  6    <- ch
  7 }  

上面的代码,在执行时会报:
throw: all goroutines are asleep - deadlock!

原因是:
ch <- 5,是unbufferedchannel,它会block,直到有人把它发送的消息取走。因此,第6行的语句永远无法执行,造成死锁

go判断死锁的代码位于:
src/pkg/runtime/proc.c


解决办法有2:
1. 把第4行修改为:
ch := make(chan int, 1) // buffered channel

2. 创建新的goroutine来执行
 1 package main
  2 
  3 func main() {
  4     ch:= make(chan int)
  5     gofunc() {
  6        ch <- 5
  7    }()
  8    <- ch
  9 }

发布了23 篇原创文章 · 获赞 9 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章