Go 中原子分配指標
Go 提供了多種管理並發的工具,但經常出現的一個問題是是否分配指針是一個原子操作。
原子操作Go
在 Go 中,唯一保證原子性的操作是在sync.atomic 套件中找到的操作。因此,分配指標本身並不是原子的。
安全指針分配
要原子地分配指針,您有兩個選項:
範例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)) }
注意事項
以上是Go 中的指標賦值是原子的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!