请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于fatal error: all goroutines are asleep - deadlock!

//代码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 发消息另外一个函数收到消息,函数本身不是立刻被调度执行,那消息是不是立刻到达啊,

正在回答 回答被采纳积分+3

1回答

ccmouse 2022-07-24 21:54:02

因为代码2中main并没有阻塞。main本身也是一个goroutine。

这个deadlock的检测是所有的goroutine都属于阻塞中。

消息是否立刻到达?不一定立刻,但是一定同步。两个goroutine通过一个channel,一个发送,一个接收,如果发送方先执行发送指令,发送方会被阻塞,直至接收放运行接收指令为止。反之也是。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕村0176662 #1
    我没有理解,我是否可以这样记住,在代码①中无人消费消息,main函数被阻塞了程序无法继续执行了,所以死锁了,代码②是协程中发送了一个无人处理的消息,但是main函数还是可以继续执行
    回复 有任何疑惑可以回复我~ 2022-07-24 23:40:56
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号