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

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

Patricia Arquette
Patricia Arquette原創
2024-12-18 21:26:10621瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn