Go でのポインター割り当てのアトミック性
Go でのポインターの割り当てはアトミックですか?言い換えれば、複数のスレッドが未定義の動作を引き起こすことなくポインターを同時に操作できますか?
答え:
Go のアトミック操作は、同期で明示的に定義されたものに限定されます。アトミックパッケージ。したがって、通常のポインタの割り当てがアトミックであるとは保証されません。
スレッド間で一貫した動作を保証するには、次の 2 つのオプションがあります。
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 中国語 Web サイトの他の関連記事を参照してください。