我只是尝试了以下代码,但结果似乎有些奇怪。它先打印奇数,然后再打印偶数。我真的很困惑。我希望它能输出奇数和偶数,就像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")
    }
}

最佳答案

您很有可能仅使用一个cpu线程运行。因此它将运行第一个goroutine,然后运行第二个。如果您告诉go它可以在多个线程上运行,那么只要操作系统在cpu上有空余时间,它们就可以同时运行。您可以通过在运行二进制文件之前设置GOMAXPROCS = 2来演示这一点。或者,您可以尝试在绵羊函数中添加runtime.Gosched()调用,看看是否触发了运行时以允许其他goroutine运行。

通常,最好不要假设两个goroutine中操作之间的顺序语义,除非您使用sync.Mutex指定特定的同步点或在 channel 之间进行通信。

10-04 12:30