ホームページ >バックエンド開発 >Golang >Go 同時実行コードが 1 ~ 5 ではなく 6 を 6 回出力するのはなぜですか?

Go 同時実行コードが 1 ~ 5 ではなく 6 を 6 回出力するのはなぜですか?

DDD
DDDオリジナル
2024-12-02 00:39:10349ブラウズ

Why Does My Go Concurrency Code Print 6 Six Times Instead of 1 Through 5?

Go 同時実行性: for ループ内の匿名関数の驚くべき動作を探索する

この探索では、予期せぬ動作を明らかにします。 for ループと匿名を使用する場合に Go 同時実行によって示される動作function.

問題:

sync.WaitGroup を使用して同時実行性をテストするために次のコード スニペットを実行すると想像してください:

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go func() {
            fmt.Println(i)
            time.Sleep(time.Second * 1)
            wg.Done()
        }()
    }

    wg.Wait()
}

驚くべきことに、出力が観察されました。予想されたシーケンス 1 ではなく、6、6、6、6、6 でした。 2、3、4、5.

説明:

この動作を理解するには、Go FAQ の「ゴルーチンとして実行されるクロージャーはどうなりますか?」を参照してください。 。このシナリオでは、for ループが完了するまでゴルーチンはスケジュールされませんでした。その結果、その時点で i は 6 に進みました。ゴルーチンが実行されると、すべてのゴルーチンはキャプチャされた i の値 (6 でした) を出力しました。

i を引数として匿名関数に渡すと、実質的に次のコピーが作成されました。現在の値。呼び出し時の値をキャプチャします。これは、コードの修正バージョンで観察される予期される動作を説明しています。

以上がGo 同時実行コードが 1 ~ 5 ではなく 6 を 6 回出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。