亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么競爭檢測器沒有檢測到這種競爭條件?

為什么競爭檢測器沒有檢測到這種競爭條件?

Go
慕碼人8056858 2023-07-10 14:30:26
我目前正在學習 Go 編程語言,并且正在嘗試原子包。在此示例中,我生成了許多 Goroutine,它們都需要增加包級別變量。有多種方法可以避免競爭條件,但現在我想使用該atomic包來解決這個問題。在我的 Windows PC ( ) 上運行以下代碼時,go run main.go結果不是我期望的結果(我期望最終結果為 1000)。最終數字介于 900 到 1000 之間。在 Go Playground 中運行代碼時,該值為 1000。這是我正在使用的代碼:https ://play.golang.org/p/8gW-AsKGzwqvar counter int64var wg sync.WaitGroupfunc main() {? ? num := 1000? ? wg.Add(num )? ? for i := 0; i < num ; i++ {? ? ? ? go func() {? ? ? ? ? ? v := atomic.LoadInt64(&counter)? ? ? ? ? ? v++? ? ? ? ? ? atomic.StoreInt64(&counter, v)? ? ? ? ? ? // atomic.AddInt64(&counter, 1)? ? ? ? ? ? // fmt.Println(v)? ? ? ? ? ? wg.Done()? ? ? ? }()? ? }? ? wg.Wait()? ? fmt.Println("final", counter)}go run main.gofinal 931go run main.gofinal 960go run main.gofinal 918我本以為競爭檢測器會給出錯誤,但它沒有:go run -race main.gofinal 1000它輸出正確的值(1000)。我使用的是go版本go1.12.7 windows/amd64(目前最新版本)我的問題:為什么競爭檢測器沒有給出錯誤,但是在沒有競爭檢測器的情況下運行代碼時我是否看到不同的值?我的理論是,加載/存儲組合不起作用的原因是這兩個原子調用作為一個整體并不是原子的。在這種情況下我應該使用該atomic.AddInt64方法,對嗎?任何幫助將不勝感激 :)
查看完整描述

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。


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號