这段代码运行没有问题,循环输出:call f1...
package main
import (
"fmt"
)
func f1() {
for {
fmt.Println("call f1...")
}
}
func f2() {
fmt.Println("call f2...")
}
func main() {
go f1()
go f2()
ch := make(chan int)
<-ch
}
若注释掉go f1()
,代码运行时提示死锁:
fatal error: all goroutines are asleep - deadlock!
代码如下:
package main
import (
"fmt"
)
func f1() {
for {
fmt.Println("call f1...")
}
}
func f2() {
fmt.Println("call f2...")
}
func main() {
// go f1()
go f2()
ch := make(chan int)
<-ch
}
为什么同是调用协程,调用f1不会产生死锁,而调用f2会产生死锁。是因为f1有死循环么?按说没有协程往通道ch写,在main中读取ch应该都会产生死锁,是不是我理解错了,求解答。谢谢!
已经提示很明确了,
all goroutines are asleep
,所有协程都在睡觉!所以go就认为是死锁了。如果有
f1
的话,至少有一个协程是在干活的。对于死锁的检测非常麻烦,或许go就采用了这种比较简单粗暴的方法。算是一个小bug吧,但是关系不大。