我刚刚尝试了下面的代码,但结果似乎有点奇怪。它首先打印奇数,然后打印偶数。我真的很困惑。我希望它一个接一个地输出奇数和偶数,就像 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 它可以在多个线程上运行,那么只要 os 在 cpu 上有空闲时间就可以同时运行。您可以通过在运行二进制文件之前设置 GOMAXPROCS=2 来演示这一点。或者您可以尝试在您的 sheep 函数中添加一个 runtime.Gosched() 调用,看看是否会触发运行时以允许另一个 goroutine 运行。
一般来说,最好不要假定两个 goroutine 中的操作之间的排序语义,除非您使用 sync.Mutex 指定特定的同步点或在它们之间通过 channel 进行通信。
关于concurrency - go 例程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11211237/