我的解決方案將如下所示,但以下代碼中是否存在爭用條件(它會崩潰嗎)?c := make(chan struct{})for i := 0; i < 1000000; i++ { go func() { select { case <-c: default: close(c) } }()}我會假設(shè)是的,但是去測試 - 種族沒有檢測到它,從經(jīng)驗上講,我無法讓它恐慌。
1 回答

莫回?zé)o
TA貢獻(xiàn)1865條經(jīng)驗 獲得超7個贊
在沒有同步的情況下啟動多個 goroutine。因此,它們同時運行??赡軙l(fā)生其中2個并行評估的情況,看到這是一個阻塞操作,所以兩個都會選擇這種情況。在這一點上,這兩個goroutine都將嘗試關(guān)閉通道,其中只有一個會成功,另一個會恐慌:您無法關(guān)閉封閉通道。<-c
default
這不是爭用條件,因為您不會同時讀取/修改變量,但嘗試關(guān)閉閉合通道是運行時死機(因此競態(tài)檢測器永遠(yuǎn)不會捕獲此情況)。
當(dāng)一個信道上有多個 goroutine 發(fā)送時,等待所有 goroutine 完成,然后在單個 goroutine 中關(guān)閉該信道。不要嘗試從多個 goroutine 關(guān)閉通道。
- 1 回答
- 0 關(guān)注
- 76 瀏覽
添加回答
舉報
0/150
提交
取消