第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么競(jìng)爭(zhēng)檢測(cè)器沒有檢測(cè)到這種競(jìng)爭(zhēng)條件?

為什么競(jìng)爭(zhēng)檢測(cè)器沒有檢測(cè)到這種競(jìng)爭(zhēng)條件?

Go
慕碼人8056858 2023-07-10 14:30:26
我目前正在學(xué)習(xí) Go 編程語言,并且正在嘗試原子包。在此示例中,我生成了許多 Goroutine,它們都需要增加包級(jí)別變量。有多種方法可以避免競(jìng)爭(zhēng)條件,但現(xiàn)在我想使用該atomic包來解決這個(gè)問題。在我的 Windows PC ( ) 上運(yùn)行以下代碼時(shí),go run main.go結(jié)果不是我期望的結(jié)果(我期望最終結(jié)果為 1000)。最終數(shù)字介于 900 到 1000 之間。在 Go Playground 中運(yùn)行代碼時(shí),該值為 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我本以為競(jìng)爭(zhēng)檢測(cè)器會(huì)給出錯(cuò)誤,但它沒有:go run -race main.gofinal 1000它輸出正確的值(1000)。我使用的是go版本go1.12.7 windows/amd64(目前最新版本)我的問題:為什么競(jìng)爭(zhēng)檢測(cè)器沒有給出錯(cuò)誤,但是在沒有競(jìng)爭(zhēng)檢測(cè)器的情況下運(yùn)行代碼時(shí)我是否看到不同的值?我的理論是,加載/存儲(chǔ)組合不起作用的原因是這兩個(gè)原子調(diào)用作為一個(gè)整體并不是原子的。在這種情況下我應(yīng)該使用該atomic.AddInt64方法,對(duì)嗎?任何幫助將不勝感激 :)
查看完整描述

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。


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 1 回答
  • 0 關(guān)注
  • 136 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)