Go 中指針的原子分配
Golang 中是否可以原子分配指針?具體來說,如果你想將指標設為nil,並保證其他執行緒可以立即觀察到這個變化,是否需要使用鎖?
在Java中,可以使用 volatile 關鍵字來實現原子指標賦值,但 Go 中不存在這樣的機制。
答案:
Go 中唯一保證的原子操作是這些由sync.atomic套件提供。分配常規指針本質上並不是原子性的。
為了確保原子性,一種選擇是使用鎖,例如sync.Mutex。或者,您可以考慮使用sync.atomic原語之一。然而,後者需要仔細處理,並且可能難以正確實現。
例如,考慮以下慣用的 Go 程式碼:
這些函數在維護執行緒的同時提供對指標的存取透過使用互斥來保證安全。
或者,如果可能的話,限制對單個 goroutine 的指標存取並使用通道來存取可能更慣用。傳達更改。
使用atomic.StorePointer
作為使用鎖的替代方案,sync/atomic 套件提供了原子指標分配的 StorePointer 函數。然而,這種方法需要使用 unsafe.Pointer,並且由於其潛在的錯誤和未定義行為而不被認為是良好實踐。
以上是Go 中可以進行原子指針分配嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!