为什么goroutine中的未缓冲通道得到了这个顺序

时间:2019-11-22 02:42:50

标签: go channel goroutine

我正在使用goroutine和通道编写一些golang并发代码 这是我的代码:

package main

import "fmt"

func main() {
    in := make(chan int)

    go func() {
        fmt.Println("Adding num to channel")
        in <- 1
        fmt.Println("Done")
    }()
    val := <- in
    fmt.Println(val)
}

我认为我创建了一个无缓冲的通道,内部通道必须等待,直到外部通道读取它为止,并且输出可能像这样:

Adding num to channel
1
Done

但是实际上,输出是:

Adding num to channel
Done
1

我很困惑,为什么内部无缓冲通道只是在不等待读取的情况下运行

1 个答案:

答案 0 :(得分:5)

您对输出的解释不正确。 goroutine确实已写入通道,此时主goroutine确实已读取该通道,但是“ fone”的printf在该值的printf之前执行。

同步操作在goroutine之间建立“先发生”关系。当goroutine写入通道时,保证在通道写入之前发生的唯一事情就是goroutine中的第一个println。通道写入和相应的读取完成后,其余goroutine和main goroutine可以按任何顺序执行。

在您的情况下,goroutine在主goroutine之前执行。