Go でアトミックにポインターを割り当てる
Go には同時実行性を管理するためのさまざまなツールが用意されていますが、よく生じる疑問の 1 つは、ポインターを割り当てるかどうかです。はアトミック操作です。
のアトミック操作Go
Go では、アトミックであることが保証されている操作は、sync.atomic パッケージにある操作のみです。そのため、ポインタの割り当てはネイティブにアトミックではありません。
安全なポインタ割り当て
ポインタをアトミックに割り当てるには、2 つのオプションがあります:
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() }
Atomic を使用した例プリミティブ
または、アトミック プリミティブを使用してアトミック性を実現できます。
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 中国語 Web サイトの他の関連記事を参照してください。