gpt4 book ai didi

go - 为什么goroutine中的未缓冲 channel 获得了此顺序

转载 作者:行者123 更新时间:2023-12-01 21:16:13 25 4
gpt4 key购买 nike

我正在用goroutine和 channel 编写一些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)
}

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

但实际上,输出为:
Adding num to channel
Done
1

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

最佳答案

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

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

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

关于go - 为什么goroutine中的未缓冲 channel 获得了此顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58986713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com