Go 中指標賦值的原子性
Go 中指標賦值是原子的嗎?換句話說,多個執行緒可以同時操作一個指標而不導致未定義的行為嗎?
答案:
Go 中的原子操作僅限於那些在sync中明確定義的操作。原子包。因此,分配常規指針不能保證是原子的。
為了確保跨執行緒的行為一致,您有兩個選擇:
1。使用鎖定同步:
使用sync.Mutex等同步原語來保護對指標的存取。例如:
var p *int var lock sync.Mutex func GetPointer() *int { lock.Lock() defer lock.Unlock() return p } func SetPointer(value *int) { lock.Lock() p = value lock.Unlock() }
2。原子基元(建議謹慎):
或者,您可以使用sync.atomic 執行原子指標分配。然而,這種方法需要仔細處理不安全的指針轉換:
import ( "sync/atomic" "unsafe" ) var p = unsafe.Pointer(nil) func SetPointer(value *int) { atomic.StorePointer(&p, unsafe.Pointer(value)) }
建議:
雖然原子原語提供了一種執行原子操作的便捷方法,但它們可以容易出錯。在 Go 中通常首選使用互斥體來保護對共享資料的並發存取。
以上是Go 中的指標賦值是原子的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!