为什么这是示例 1 中的死锁,并且在示例 2 中没有死锁或打印任何内容?示例 1。)func main() { w := sync.WaitGroup{} w.Add(4) c := make(chan int) go func() { c <- 1; w.Done() }() go func() { c <- 2; w.Done() }() go func() { c <- 3; w.Done() }() go func() { println(len(c)); w.Done() }() w.Wait()}示例 2。)func main() { w := sync.WaitGroup{} w.Add(3) c := make(chan int) go func() { c <- 1; w.Done() }() go func() { c <- 2; w.Done() }() go func() { c <- 3; w.Done() }() go func() { w.Wait(); println(len(c)) }()}
2 回答

梵蒂冈之花
TA贡献1900条经验 获得超5个赞
在第一个示例中,通道将无法发送,因为无缓冲通道的另一端没有接收器。发送的将永远阻塞。因此等待组将永远等待。这是一个死锁情况,因为您的程序根本无法继续。
在第二种情况下,同样的事情也会发生,但是你在一个单独的 goroutine 中等待。所以主函数能够继续。这不是一个完全的僵局。在这种情况下,继续意味着程序刚刚存在。

慕妹3146593
TA贡献1820条经验 获得超9个赞
您的第一个示例启动了 3 个 goroutine,每个都尝试在c
无缓冲通道上发送一个值。由于没有人从通道接收,所有这些都会阻塞。所以main()
等待他们完成,也会被阻塞。所有 goroutine 都被阻塞:死锁。
在您的第二个示例中,main()
函数“只是”启动 goroutines,之后不做任何事情。当main
goroutine 完成时(当你的main()
函数返回时),你的应用程序也会结束,它不会等待其他非main
goroutine 完成。有关详细信息,请参阅goroutine 无输出。
- 2 回答
- 0 关注
- 104 浏览
添加回答
举报
0/150
提交
取消