关于fatal error: all goroutines are asleep - deadlock!
来源:11-4 用select进行调度

慕村0176662
2022-07-23
//代码1⃣️
func main() {
c := make(chan int)
c <- 2
//fatal error: all goroutines are asleep - deadlock!
}
//代码2⃣️
func main() {
go func() {
c := make(chan int)
c <- 3
}()
time.Sleep(time.Second * 3)
}
为什么这两段代码一个报错一个没有? 对deadlock不是很能理解
老师有说channel(<-)的调用是阻塞的,用channel 发消息另外一个函数收到消息,函数本身不是立刻被调度执行,那消息是不是立刻到达啊,
写回答
1回答
-
ccmouse
2022-07-24
因为代码2中main并没有阻塞。main本身也是一个goroutine。
这个deadlock的检测是所有的goroutine都属于阻塞中。
消息是否立刻到达?不一定立刻,但是一定同步。两个goroutine通过一个channel,一个发送,一个接收,如果发送方先执行发送指令,发送方会被阻塞,直至接收放运行接收指令为止。反之也是。
112022-07-24
相似问题