ホームページ > バックエンド開発 > Golang > Go のポインタ割り当てはアトミックですか?

Go のポインタ割り当てはアトミックですか?

Patricia Arquette
リリース: 2024-12-18 21:26:10
オリジナル
619 人が閲覧しました

Is Pointer Assignment in Go Atomic?

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

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