Go でのポインタのアトミックな割り当て
Golang でポインタをアトミックに割り当てることは可能ですか?具体的には、ポインタを nil に設定し、他のスレッドがその変更をすぐに監視できるようにしたい場合、ロックを使用する必要がありますか?
Java では、volatile キーワードを使用してアトミックなポインタ割り当てを実現できます。しかし、そのようなメカニズムは Go には存在しません。
答え:
唯一保証されたアトミックGo の操作は、sync.atomic パッケージによって提供されるものです。通常のポインタの割り当ては本質的にアトミックではありません。
アトミック性を確保するための 1 つのオプションは、sync.Mutex などのロックを使用することです。あるいは、sync.atomic プリミティブのいずれかの使用を検討することもできます。ただし、後者は慎重な処理が必要であり、正しく実装するのが難しい場合があります。
たとえば、次の慣用的な Go コードを考えてみましょう:
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() }
これらの関数は、スレッドを維持しながらポインタへのアクセスを提供します。
あるいは、可能であれば、単一の goroutine へのポインタ アクセスを制限する方が慣用的かもしれません。チャネルを使用して変更を伝達します。
atomic.StorePointer の使用
ロックを使用する代わりに、sync/atomic パッケージはアトミック ポインター割り当て用の StorePointer 関数を提供します。ただし、このアプローチには unsafe.Pointer の使用が必要であり、エラーや未定義の動作が発生する可能性があるため、良い方法とは見なされません。
以上がGo ではアトミック ポインターの割り当ては可能ですか?また、それを安全に実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。