首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >go通道读取并发和阻塞

go通道读取并发和阻塞
EN

Stack Overflow用户
提问于 2018-10-18 03:05:18
回答 1查看 40关注 0票数 1
代码语言:javascript
复制
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)
}

大家好,这是官方网站上的频道使用示例。

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

这句话真把我搞糊涂了。

代码语言:javascript
复制
x, y := <-c, <-c // receive from c

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

这个假设是正确的吗?

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

如果第二个例程没有结束,main会在这一行被阻塞吗?

提前谢谢。新手来吧。

EN

回答 1

Stack Overflow用户

发布于 2018-10-18 03:14:20

我的理解是,当第一个例程写入通道时,第二个例程的写入应该被阻塞,然后

读取x(或y)的值。然后第二个例程写入通道,主读取x(或y)。

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

go如何决定x或y的结果?

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

如果第二个例程永远不会结束,

会在这一行阻塞吗?

不是的。无论写入通道的goroutine是否仍在运行,它都会阻塞,直到将值写入通道为止(实际上,如果这是所需的行为,例程可以继续运行并将值永远写入通道)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52861948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档