1 回答

TA貢獻1836條經驗 獲得超5個贊
您的代碼中沒有任何惡意內容,因此這就是競爭檢測器未檢測到任何內容的原因。您的counter
變量始終atomic
通過啟動的 goroutine 中的包進行訪問,而不是直接訪問。
有時你得到 1000 個有時更少的原因是由于運行 goroutine 的活動線程的數量:GOMAXPROCS
。在 Go Playground 上它是 1,所以任何時候你都有一個活動的 goroutine(所以基本上你的應用程序是按順序執行的,沒有任何并行性)。并且當前的 goroutine 調度器不會任意將 goroutine 停放。
在你的本地機器上,你可能有一個多核 CPU,并且GOMAXPROCS
默認為可用邏輯 CPU 的數量,因此GOMAXPROCS
大于 1,因此你有多個并行運行的 goroutine?(真正的并行,而不僅僅是并發)。
看這個片段:
v := atomic.LoadInt64(&counter)
v++
atomic.StoreInt64(&counter, v)
您加載counter值并將其分配給v,您遞增v,然后存儲回遞增的值v。如果 2 個并行 goroutine 同時執行此操作會發生什么?假設兩者都加載 value 100。兩者都會增加其本地副本:101. 兩者都回寫101,盡管應該是在102。
是的,原子遞增計數器的正確方法是atomic.AddInt64()
這樣使用:
for i := 0; i < num; i++ {
? ? go func() {
? ? ? ? atomic.AddInt64(&counter, 1)
? ? ? ? wg.Done()
? ? }()
}
這樣無論是什么,你總是會得到 1000 GOMAXPROCS。
- 1 回答
- 0 關注
- 126 瀏覽
添加回答
舉報