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

是否可以使用 select 从多个 goroutine 安全地关闭一个通道一次?

是否可以使用 select 从多个 goroutine 安全地关闭一个通道一次?

Go
芜湖不芜 2022-08-24 16:14:43
我的解决方案将如下所示,但以下代码中是否存在争用条件(它会崩溃吗)?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都将尝试关闭通道,其中只有一个会成功,另一个会恐慌:您无法关闭封闭通道。<-cdefault

这不是争用条件,因为您不会同时读取/修改变量,但尝试关闭闭合通道是运行时死机(因此竞态检测器永远不会捕获此情况)。

当一个信道上有多个 goroutine 发送时,等待所有 goroutine 完成,然后在单个 goroutine 中关闭该信道。不要尝试从多个 goroutine 关闭通道。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信