我的解决方案如下,但以下代码中是否存在竞争条件(它会死机吗(?
c := make(chan struct{})
for i := 0; i < 1000000; i++ {
go func() {
select {
case <-c:
default:
close(c)
}
}()
}
我想是的,但去测试赛并没有发现它,从经验上讲,我不能让它恐慌。
您在没有同步的情况下启动多个goroutines。所以它们同时运行。可能发生的情况是,他们中的两个并行评估<-c
,因为这是一个阻塞操作,所以两个都会选择default
的情况。到那时,这两个goroutine都会试图关闭通道,只有一个会成功,另一个会恐慌:你不能关闭一个关闭的通道。
这不是竞争条件,因为您不同时读取/修改变量,但试图关闭一个关闭的通道是运行时的恐慌(因此竞争检测器永远不会捕捉到这一点(。
当一个通道上有多个goroutine发送时,请等待所有goroutine完成,然后在单个goroutine中关闭通道。不要试图从多个goroutine中关闭一个通道。