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

为什么这部分代码先于另一部分执行?

为什么这部分代码先于另一部分执行?

Go
沧海一幻觉 2022-08-01 10:47:20
我对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 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您似乎期望操作员关心goroutines的创建顺序。这是没有承诺的(甚至不太可能)。如果两个运算符正在读取同一通道,则哪个运算符获取的值是随机的。如果要对此进行排序,则需要创建另一个通道,第二个 goroutine 写入该通道,第三个通道读取该通道。<-<-

缓冲在这里没有帮助,因为问题不在于它在写入时阻塞。第三个函数使用一个值而不生成一个值,因此第二个函数没有任何可读的内容。


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

添加回答

举报

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