1 回答

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