首頁 > 後端開發 > Golang > Go 中的指標賦值是原子的嗎?

Go 中的指標賦值是原子的嗎?

Patricia Arquette
發布: 2024-12-18 21:26:10
原創
620 人瀏覽過

Is Pointer Assignment in Go Atomic?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板