为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这部分代码在另一部分之前执行?

为什么这部分代码在另一部分之前执行?

Go
Qyouu 2022-07-25 11:02:04
我对 Go 很陌生,我正在尝试了解无缓冲通道和 goroutines。我有这个代码:func main() {var waitGroup sync.WaitGroupwaitGroup.Add(3)c := make(chan int)go func() {    defer waitGroup.Done()    x := 1    res := x * 2    fmt.Println(x, "* 2 = ", res)    c <- x}()go func() {    defer waitGroup.Done()    x := <-c    res := x * 3    fmt.Println(x, "* 3 = ", res)    c <- x}()go func() {    defer waitGroup.Done()    x := <-c    res := x * 4    fmt.Println(x, "* 4 = ", res)}()waitGroup.Wait()close(c)}所以我希望输出是:1 * 2 =  21 * 3 =  31 * 4 =  4相反,我得到:1 * 2 =  21 * 4 =  4fatal error: all goroutines are asleep - deadlock!我真的不明白为什么第二个函数会在第三个函数之后执行。如何在不将通道更改为缓冲通道的情况下获得结果。
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您似乎希望<-操作员关心 goroutines 的创建顺序。这不是承诺的(甚至是不可能的)。如果两个<-操作员正在读取同一个通道,则哪一个得到的值是随机的。如果你想订购这个,你需要创建另一个通道,第二个 goroutine 写入,第三个读取。

缓冲在这里无济于事,因为问题不在于它在写入时阻塞。这是第三个函数消耗一个值并且不生成一个值,所以第二个函数没有什么可读取的。


查看完整回答
反对 回复 2022-07-25
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信