Atomic.StoreUint32 與Sync.Once 中的普通賦值
在Go 的sync.Once 上下文中,atomic.StoreUint32 操作是優先優先於將did 欄位設定為1 的正常分配。此首選項源自於sync.Once 提供的特定語意和保證。
Sync.Once 的保證
Sync.Once 確保傳遞給 Do 方法的函數僅執行一次。為了維持這種保證,必須原子更新表示函數是否已經執行的done欄位。
正常賦值的限制
如果正常賦值使用(相當於 o.done = 1),在記憶體模型較弱的架構上無法保證此保證。在這樣的架構上,一個 goroutine 所做的更改可能不會立即對其他 goroutine 可見,這可能會導致多個 goroutine 呼叫該函數,違反了一次性執行要求。
Atomic.StoreUint32 操作
atomic.StoreUint32 是一個原子操作,可確保所有 goroutine 中寫入的可見性。透過使用它來設定done字段,sync.Once確保所有goroutine在將函數標記為完成之前觀察到函數執行的效果。
原子操作的範圍
需要注意的是,sync.Once中使用的原子操作主要是為了優化快速路徑。透過 o.m.Lock() 和 o.m.Unlock() 同步的互斥體外部的完成標誌的存取只需要安全,不需要嚴格排序。這種優化允許在不犧牲正確性的情況下在熱路徑上有效執行。
同時存取注意事項
即使函數執行受互斥體保護,讀取完成欄位也是如此資料競賽。因此,atomic.LoadUint32 用於讀取欄位以確保正確的可見性。同樣,使用atomic.StoreUint32在函數執行後更新字段,保證其他goroutines在done標誌被設定之前觀察到函數的完成。
綜上所述,atomic.StoreUint32優於普通賦值由於它提供了原子可見性,即使在記憶體模型較弱的體系結構上,也能保證函數僅執行一次。此優化用於增強快速路徑上的效能。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3