1

このコードを見てください:

func main() {
    var x int
    go func() {
        for {
            x++
        }
    }()
    time.Sleep(time.Second)
    fmt.Println("x =", x)
}

最後にx等しいのはなぜですか?0Go のスケジューラーがtime.Sleep()ゴルーチンを取得するために呼び出しを必要とすることは理解していますが、なぜそうしないのでしょうか?

ヒント: for ループ内にatime.Sleep()または への呼び出しをruntime.Gosched()しかし、なぜ?

更新:同じコードの次のバージョンを確認してください。

func main() {
    var x int
    go func() {
        for i := 0; i < 10000; i++ {
            x++
        }
    }()
    time.Sleep(time.Second)
    fmt.Println("x =", x)
}

奇妙なことに、ゴルーチン内のコードが実行され、x0 ではなくなりました。コンパイラはここで最適化を行いますか?

4

2 に答える 2