我的解决方案将如下所示,但以下代码中是否存在争用条件(它会崩溃吗)?c := make(chan struct{})for i := 0; i < 1000000; i++ { go func() { select { case <-c: default: close(c) } }()}我会假设是的,但是去测试 - 种族没有检测到它,从经验上讲,我无法让它恐慌。
1 回答
莫回无
TA贡献1865条经验 获得超7个赞
在没有同步的情况下启动多个 goroutine。因此,它们同时运行。可能会发生其中2个并行评估的情况,看到这是一个阻塞操作,所以两个都会选择这种情况。在这一点上,这两个goroutine都将尝试关闭通道,其中只有一个会成功,另一个会恐慌:您无法关闭封闭通道。<-c
default
这不是争用条件,因为您不会同时读取/修改变量,但尝试关闭闭合通道是运行时死机(因此竞态检测器永远不会捕获此情况)。
当一个信道上有多个 goroutine 发送时,等待所有 goroutine 完成,然后在单个 goroutine 中关闭该信道。不要尝试从多个 goroutine 关闭通道。
- 1 回答
- 0 关注
- 62 浏览
添加回答
举报
0/150
提交
取消