【问题标题】:understand go unbuffered channel example了解去无缓冲通道示例
【发布时间】:2018-05-06 22:42:15
【问题描述】:

official code example

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}
    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x := <-c
    y := <-c
    fmt.Println(x, y, x+y)
}

打印:-5、17、12

为什么不打印 17、-5、12 ?

我认为 x 应该是 17

【问题讨论】:

    标签: go concurrency channel


    【解决方案1】:

    无法保证您的 go sum(...) goroutines 将以什么顺序开始,哪个将首先完成(并发送到通道)。

    【讨论】:

      【解决方案2】:

      首先将哪个值写入通道没有明确的顺序,这完全取决于调度程序。由于示例所做的只是添加结果,因此结果出现的方向实际上并不重要。

      【讨论】:

        猜你喜欢
        • 2017-08-02
        • 2018-07-03
        • 2016-03-18
        • 2014-01-30
        • 2020-09-03
        • 2022-10-08
        • 2018-10-02
        • 2020-10-19
        • 2021-10-13
        相关资源
        最近更新 更多