ホームページ > バックエンド開発 > Golang > Go ではアトミック ポインターの割り当ては可能ですか?また、それを安全に実現するにはどうすればよいですか?

Go ではアトミック ポインターの割り当ては可能ですか?また、それを安全に実現するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-12 11:08:10
オリジナル
790 人が閲覧しました

Is Atomic Pointer Assignment Possible in Go, and How Can It Be Achieved Safely?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート