猿问

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

我的解决方案将如下所示,但以下代码中是否存在争用条件(它会崩溃吗)?


c := make(chan struct{})


for i := 0; i < 1000000; i++ {

    go func() {

        select {

        case <-c:

        default:

            close(c)

        }

    }()

}

我会假设是的,但是去测试 - 种族没有检测到它,从经验上讲,我无法让它恐慌。


芜湖不芜
浏览 63回答 1
1回答

莫回无

在没有同步的情况下启动多个 goroutine。因此,它们同时运行。可能会发生其中2个并行评估的情况,看到这是一个阻塞操作,所以两个都会选择这种情况。在这一点上,这两个goroutine都将尝试关闭通道,其中只有一个会成功,另一个会恐慌:您无法关闭封闭通道。<-cdefault这不是争用条件,因为您不会同时读取/修改变量,但尝试关闭闭合通道是运行时死机(因此竞态检测器永远不会捕获此情况)。当一个信道上有多个 goroutine 发送时,等待所有 goroutine 完成,然后在单个 goroutine 中关闭该信道。不要尝试从多个 goroutine 关闭通道。
随时随地看视频慕课网APP

相关分类

Go
我要回答