var condition bool
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(item) {
if meetsCondition(item) {
condition = true
}
wg.Done()
}(item)
}
wg.Wait()
// is it safe to check condition here?
這裏有一個討論這個問題的舊論壇: https://groups.google.com/forum/#!topic/golang-nuts/5oHzhzXCcmM答案是肯定的,它是安全的。然後討論離題使用原子等,這不是我想問的。在這種情況下WaitGroup.Wait()意味着內存屏障嗎?
在規範中甚至沒有提及WaitGroup,它的文檔是說WaitGroup.Wait:「等待塊,直到WaitGroup計數器爲零。」 沒有設置任何發生之前的關係(或做它?)。
這是否意味着第一個答案「wg.Wait返回後檢查條件是否安全」是非官方的?如果它是官方的,我失蹤的原因是什麼?非常感謝,如果你回答。
更新: 這是@ peterSO的@ ravi的答案後更新。謝謝。
好吧,如果您選擇的項目數> 1,顯然可能會出現競爭狀況。提示:條件只能設置爲true。不過,我也有同樣的問題。
,也許,我應該指出:
- 的底層架構只能是86,64或ARM
- 項目數可以在1
更新2 我當產品數量== 1時,創建後續問題: Can you make this 'incorrectly synchronized' test fail?