栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有多个等待组的管道中通道范围内的死锁

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有多个等待组的管道中通道范围内的死锁

死锁不在跨通道范围循环中。如果在操场上运行代码,则会在堆栈跟踪的顶部看到该错误是由引起的

wg2.Wait
(操场上的第88行并由堆栈跟踪指向)。同样在stacktrace中,您可以看到由于死锁而尚未完成的所有goroutine,这是因为它
oneResult<-t
从未完成,因此循环中启动的所有goroutine都不会完成。

所以主要问题在这里:

wg2.Wait()close(oneResult)// ...for n := range oneResult{// ...

我想,也不希望在封闭的通道上循环。但是,即使您没有关闭通道,该循环也将永远不会开始,因为

wg2.Wait()
它将等待直到 完成

oneResult <- twg2.Done()

但是永远不会做,因为它依赖于已经在运行的循环。

oneResult <-t
除非另一侧有人从该通道接收信号,这是您的循环,否则该行将不会完成,但是,通道范围循环仍在等待
wg2.Wait()
完成。

因此,实质上,您在通道的发送方和接收方之间具有“循环依赖”。

要解决此问题,您需要允许循环从通道开始接收,同时仍要确保完成后通道已关闭。您可以通过将两条等待和关闭行包装到它们自己的goroutine中来进行操作。

https://play.golang.com/p/rwwCFVszZ6Q



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484333.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号