猿问

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

我对Go很陌生,我正在努力学习无缓冲频道和goroutines。


我有这个代码:


func main() {


var waitGroup sync.WaitGroup

waitGroup.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 =  2

1 * 3 =  3

1 * 4 =  4

相反,我得到:


1 * 2 =  2

1 * 4 =  4

fatal error: all goroutines are asleep - deadlock!

我真的不明白为什么第二个函数在第三个之后执行。如何在不将通道更改为缓冲通道的情况下获得结果。


沧海一幻觉
浏览 60回答 1
1回答

慕盖茨4494581

您似乎期望操作员关心goroutines的创建顺序。这是没有承诺的(甚至不太可能)。如果两个运算符正在读取同一通道,则哪个运算符获取的值是随机的。如果要对此进行排序,则需要创建另一个通道,第二个 goroutine 写入该通道,第三个通道读取该通道。<-<-缓冲在这里没有帮助,因为问题不在于它在写入时阻塞。第三个函数使用一个值而不生成一个值,因此第二个函数没有任何可读的内容。
随时随地看视频慕课网APP

相关分类

Go
我要回答