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

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

為什么是原子的。StoreUint32 優(yōu)先于同步中的正常分配。一次?

為什么是原子的。StoreUint32 優(yōu)先于同步中的正常分配。一次?

Go
繁華開滿天機(jī) 2022-08-01 18:48:35
在閱讀 Go 的源代碼時(shí),我對 src/sync/once.go 中的代碼有疑問:func (o *Once) Do(f func()) {    // Note: Here is an incorrect implementation of Do:    //    //  if atomic.CompareAndSwapUint32(&o.done, 0, 1) {    //      f()    //  }    //    // Do guarantees that when it returns, f has finished.    // This implementation would not implement that guarantee:    // given two simultaneous calls, the winner of the cas would    // call f, and the second would return immediately, without    // waiting for the first's call to f to complete.    // This is why the slow path falls back to a mutex, and why    // the atomic.StoreUint32 must be delayed until after f returns.    if atomic.LoadUint32(&o.done) == 0 {        // Outlined slow-path to allow inlining of the fast-path.        o.doSlow(f)    }}func (o *Once) doSlow(f func()) {    o.m.Lock()    defer o.m.Unlock()    if o.done == 0 {        defer atomic.StoreUint32(&o.done, 1)        f()    }}為什么使用,而不是說?這些不是等價(jià)的嗎?有什么區(qū)別?atomic.StoreUint32o.done = 1我們是否必須使用原子運(yùn)算()來確保其他goroutines可以在內(nèi)存較弱的機(jī)器上觀察到之前設(shè)置為1的效果?atomic.StoreUint32f()o.done
查看完整描述

3 回答

?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊

請記住,除非您是手動(dòng)編寫程序集,否則您不是在編程到機(jī)器的內(nèi)存模型,而是在編程到Go的內(nèi)存模型。這意味著,即使原始賦值與您的架構(gòu)是原子的,Go也需要使用原子包來確保所有支持的架構(gòu)的正確性。

對互斥鎖外部標(biāo)志的訪問只需要是安全的,而不是嚴(yán)格排序的,因此可以使用原子操作,而不是總是使用互斥鎖獲取鎖。這是一種優(yōu)化,使快速路徑盡可能高效,允許在熱路徑中使用。donesync.Once

用于 的互斥體僅用于該函數(shù)內(nèi)的互斥,以確保在設(shè)置標(biāo)志之前只有一個(gè)調(diào)用方能夠進(jìn)入該函數(shù)。該標(biāo)志是使用 編寫的,因?yàn)樗赡芘c受互斥鎖保護(hù)的關(guān)鍵部分之外同時(shí)發(fā)生。doSlowf()doneatomic.StoreUint32atomic.LoadUint32

在寫入的同時(shí)讀取字段,甚至是原子寫入,也是一場數(shù)據(jù)競賽。僅僅因?yàn)樽侄问窃幼x取的,并不意味著您可以使用正常的賦值來寫入它,因此首先檢查標(biāo)志并編寫doneatomic.LoadUint32atomic.StoreUint32

對 within 的直接讀取安全的,因?yàn)樗艿交コ怄i的并發(fā)寫入保護(hù)。同時(shí)讀取值是安全的,因?yàn)閮烧叨际亲x取操作。donedoSlowatomic.LoadUint32


查看完整回答
反對 回復(fù) 2022-08-01
?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊

原子操作可用于同步不同 goroutine 的執(zhí)行。

如果沒有同步,即使 goroutine 觀察到 o.done == 1,也不能保證它會(huì)觀察到 的效果。f()


查看完整回答
反對 回復(fù) 2022-08-01
?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

func (o *Once) Do(f func()) {

    if atomic.LoadUint32(&o.done) == 0 {       # 1

        // Outlined slow-path to allow inlining of the fast-path.

        o.doSlow(f)

    }

}


func (o *Once) doSlow(f func()) {

    o.m.Lock()

    defer o.m.Unlock()

    if o.done == 0 {                            # 2

        defer atomic.StoreUint32(&o.done, 1)    # 3

        f()

    }

}

#1和#3:#1是讀的,#3是寫的,它不安全,需要mutext來保護(hù)

#2和#3 :在關(guān)鍵部分,由互斥體支持,安全。


查看完整回答
反對 回復(fù) 2022-08-01
  • 3 回答
  • 0 關(guān)注
  • 150 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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