gpt4 book ai didi

go channel 读并发和阻塞

转载 作者:IT王子 更新时间:2023-10-29 02:08:34 31 4
gpt4 key购买 nike

import "fmt"

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, y := <-c, <-c // receive from c

fmt.Println(x, y, x+y)
}

大家好,这是官网的 channel 使用示例。

该示例启动 2 个 go 例程来计算子数组的和。然后它写入 int channel 。

这一行真的让我很困惑。

x, y := <-c, <-c // receive from c

我的理解是,当第一个例程写入 channel 时,第二个例程的写入应该被阻止,然后 main 将值读取到 x(或 y)。然后第二个例程写入 channel ,主要读取 x(或 y)。

这个假设是否正确?

go 如何决定哪个结果去 x 或 y?

如果第二个例程永远不会结束,main 是否在这一行被阻塞?

提前致谢。在这里成为菜鸟。

最佳答案

my understanding is when first routine write to the channel, second routine's writing should be blocked, then main reads the value to x (or y). then 2nd routine writes to channel, main reads to x(or y).

正确,因为它是无缓冲的。如果 channel 被缓冲,则两个例程都可以写入它而不会阻塞,直到缓冲区已满。

How does go decide which result goes to x or y?

它“决定”导致词法顺序的结果 - 读取的第一个值进入第一个变量 x ,第二个值读入第二个变量y .

and if 2nd routine never ends, does main being blocked at this line?

没有。它会阻塞,直到将值写入 channel ,而不管写入 channel 的 goroutine 是否仍在运行(实际上,如果这是所需的行为,例程可以继续运行并永远向 channel 写入值) .

关于go channel 读并发和阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52861948/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com