为了账号安全,请及时绑定邮箱和手机立即绑定

与 GO 等待组同步

与 GO 等待组同步

Go
森栏 2022-11-08 10:40:42
为什么这是示例 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 中等待。所以主函数能够继续。这不是一个完全的僵局。在这种情况下,继续意味着程序刚刚存在。


查看完整回答
反对 回复 2022-11-08
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

您的第一个示例启动了 3 个 goroutine,每个都尝试在c无缓冲通道上发送一个值。由于没有人从通道接收,所有这些都会阻塞。所以main()等待他们完成,也会被阻塞。所有 goroutine 都被阻塞:死锁。

在您的第二个示例中,main()函数“只是”启动 goroutines,之后不做任何事情。当maingoroutine 完成时(当你的main()函数返回时),你的应用程序也会结束,它不会等待其他非maingoroutine 完成。有关详细信息,请参阅goroutine 无输出


查看完整回答
反对 回复 2022-11-08
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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