Go の同時実行により予期しない変数値が発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-26 22:40:14
オリジナル
511 人が閲覧しました

Why Can Go's Concurrent Execution Lead to Unexpected Variable Values?

GoLang での不正な同期

GoLang メモリ モデルのドキュメントには、次のコードでは 2 の後に 0 が続く結果が表示される可能性があると記載されています:

var a, b int

func f() {
    a = 1
    b = 2
}

func g() {
    print(b)
    print(a)
}

func main() {
    go f()
    g()
}
ログイン後にコピー

不正な同期の原因

この動作が発生するGo ルーチンの非同期の性質によるものです。関数を実行する前に、変数 a と b はそれぞれのゼロ値 (0) に初期化されます。 f() 関数はこれらの変数を変更し、その後 g() 関数はそれらの値を出力します。

ゴルーチン内では、言語仕様により、プログラムで指定された順序で読み取りと書き込みが行われることが保証されます。ただし、ゴルーチンの動作に影響を与えることなく操作の並べ替えが発生する可能性があります。ここではこれが当てはまります。

f() ゴルーチンでは、コンパイラは b と a への割り当てを並べ替えることによって最適化できます。ゴルーチンは代入後にこれらの変数を使用しないため、並べ替えはその動作に影響しません。

同期に関する考慮事項

一方、ゴルーチン間の同期には一貫性が必要です。同期ポイントでは、コンパイラはすべての割り当てが完了していることを保証し、g() ゴルーチンが値を読み取るまでに a と b の両方に値が割り当てられていることを確認します。これにより、変更された値 (2 と 1) が正しく印刷されます。

以上がGo の同時実行により予期しない変数値が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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