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