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

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

Linda Hamilton
Linda Hamilton原創
2024-12-24 14:09:10294瀏覽

Is Pointer Assignment Atomic in Go, and How Can It Be Made Safe?

Go 中原子分配指標

Go 提供了多種管理並發的工具,但經常出現的一個問題是是否分配指針是一個原子操作。

原子操作Go

在 Go 中,唯一保證原子性的操作是在sync.atomic 套件中找到的操作。因此,分配指標本身並不是原子的。

安全指針分配

要原子地分配指針,您有兩個選項:

  1. 獲取鎖:使用鎖(例如,sync.Mutex)確保一次只有一個goroutine 可以存取指針,從而防止競爭條件。
  2. 使用原子原語:sync.atomic 套件提供了原子原語,例如atomic.StorePointer 和atomic.LoadPointer,它們可用於自動分配和檢索指標值。

範例Mutex

以下是使用sync.Mutex來保護指標分配的範例:

import "sync"

var secretPointer *int
var pointerLock sync.Mutex

func CurrentPointer() *int {
    pointerLock.Lock()
    defer pointerLock.Unlock()
    return secretPointer
}

func SetPointer(p *int) {
    pointerLock.Lock()
    secretPointer = p
    pointerLock.Unlock()
}

原子原語範例

或者,你可以使用原子原語來實現原子性:

import "sync/atomic"
import "unsafe"

type Struct struct {
    p unsafe.Pointer // some pointer
}

func main() {
    data := 1

    info := Struct{p: unsafe.Pointer(&data)}

    fmt.Printf("info is %d\n", *(*int)(info.p))

    otherData := 2

    atomic.StorePointer(&info.p, unsafe.Pointer(&otherData))

    fmt.Printf("info is %d\n", *(*int)(info.p))
}

注意事項

  • 使用sync.atomic可能會使程式碼複雜化,因為需要轉換為unsafe.Pointer。
  • 在Go 中,鎖通常被認為是慣用的,而使用原子原語則是
  • 另一種方法是使用單個goroutine 進行指針訪問並通過通道傳達命令,這更符合Go 的並發模型。

以上是Go 中的指標賦值是原子的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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