golang chan发送方和接收队列顺序问题

问题描述 投票:0回答:1

这是我的代码,为什么答案不是顺序。 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!

为什么不是顺序?

go channel gmp
1个回答
0
投票

调度器可以自由选择等待的 goroutine 之一,无需指定任何其他内容来启用内部优化。

除了Go内存模型给出的保证之外,您没有其他保证,因此您看到的顺序是有效的,但不保证可重现。

为什么你期望某个订单?

© www.soinside.com 2019 - 2024. All rights reserved.