Ari*_*ric 0 channel go 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)
}
Run Code Online (Sandbox Code Playgroud)
我认为我创建了一个无缓冲的通道,内部通道必须等待,直到外部通道读取它为止,并且输出可能像这样:
Adding num to channel
1
Done
Run Code Online (Sandbox Code Playgroud)
但实际上,输出为:
Adding num to channel
Done
1
Run Code Online (Sandbox Code Playgroud)
我很困惑,为什么内部无缓冲通道只是在不等待读取的情况下运行
您对输出的解释不正确。该goroutine确实写入了通道,此时主goroutine确实读取了该通道,但是对于“ Done”的printf在该值的printf之前执行。
同步操作在goroutine之间建立“先发生”关系。当goroutine写入通道时,保证在通道写入之前发生的唯一事情就是goroutine中的第一个println。通道写入和相应的读取完成后,其余goroutine和main goroutine可以任何顺序执行。
在您的情况下,goroutine在主goroutine之前执行。
| 归档时间: |
|
| 查看次数: |
39 次 |
| 最近记录: |