关于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,一个发送,一个接收,如果发送方先执行发送指令,发送方会被阻塞,直至接收放运行接收指令为止。反之也是。

1
1
慕村0176662
我没有理解,我是否可以这样记住,在代码①中无人消费消息,main函数被阻塞了程序无法继续执行了,所以死锁了,代码②是协程中发送了一个无人处理的消息,但是main函数还是可以继续执行
2022-07-24
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程