这是我的代码,为什么答案不是顺序。 GOMAXPROCS 是 1 ,我很困惑为什么第一个收到消息的人是最后一个加入队列的 Goroutine!
我知道在 P > 1 的例子中,结果是不序列的,因为 GMP 调度 goroutinue 有很多线程。
func main() {
runtime.GOMAXPROCS(1)
c := make(chan struct{})
ok := make(chan int)
n := 10
for i := 0; i < n; i++ {
go foo(i, c, ok)
}
time.Sleep(time.Millisecond)
for i := 0; i < n; i++ {
go func() {
<-c
}()
}
time.Sleep(time.Second)
close(ok)
}
func foo(i int, c chan struct{}, ok chan int) {
for {
select {
case c <- struct{}{}:
fmt.Printf("%d sendMsg!\n", i)
case <-ok:
fmt.Printf("%d closed\n", i)
return
}
}
}
答案如下:
9 sendMsg!
0 sendMsg!
1 sendMsg!
2 sendMsg!
3 sendMsg!
4 sendMsg!
5 sendMsg!
6 sendMsg!
7 sendMsg!
8 sendMsg!
为什么不是顺序?
调度器可以自由选择等待的 goroutine 之一,无需指定任何其他内容来启用内部优化。
除了Go内存模型给出的保证之外,您没有其他保证,因此您看到的顺序是有效的,但不保证可重现。
为什么你期望某个订单?