0

次のコードを試してみましたが、結果は少し奇妙に思えます。最初に奇数を出力し、次に偶数を出力します。私はそれについて本当に混乱しています。1、2、3、4... のように、奇数と偶数を次々に出力することを望んでいました。誰が私を助けることができます?

package main

import (
    "fmt"
    "time"
)

func main() {
    go sheep(1)
    go sheep(2)
    time.Sleep(100000)
}

func sheep(i int) {
    for ; ; i += 2 {
        fmt.Println(i,"sheeps")
    }
}
4

2 に答える 2

6

多くの場合、1 つの CPU スレッドでしか実行していません。最初のゴルーチンを実行し、次に 2 番目のゴルーチンを実行します。複数のスレッドで実行できると言った場合、OS に CPU の空き時間があれば、両方を同時に実行できます。これは、バイナリを実行する前に GOMAXPROCS=2 を設定することで実証できます。または、羊の関数に runtime.Gosched() 呼び出しを追加して、それがランタイムをトリガーして他のゴルーチンの実行を許可するかどうかを確認することもできます。

一般的には、sync.Mutex を使用して特定の同期ポイントを指定するか、チャネルでそれらの間で通信する場合を除き、2 つのゴルーチンの操作間の順序付けセマンティクスを想定しない方がよいでしょう。

于 2012-06-26T16:03:59.207 に答える
3

非同期ゴルーチンは、完全に定義されていない順序で実行されます。次のようなものを印刷したい場合

1 sheeps
2 sheeps
3 sheeps
....

その正確な順序では、ゴルーチンは間違った方法です。並行性は、物事が発生する順序をあまり気にしない場合にうまく機能します。

同期 (呼び出しの周りでミューテックスをロックするか、チャネルを使用する) によってプログラムに順序を課すことはできfmt.Printlnますが、単一のゴルーチンを使用するコードをより簡単に記述できるため、それは無意味です。

于 2012-06-26T19:32:13.510 に答える