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