【发布时间】:2020-09-25 01:37:27
【问题描述】:
我已经阅读了https://golang.org/ref/mem,但有些部分我仍然不清楚。
例如,在“通道通信”部分中,它说:“对 a 的写入发生在 c 上的发送之前”,但我不知道为什么会这样。我正在复制从上述页面中提取的示例代码以提供上下文。
var c = make(chan int, 10)
var a string
func f() {
a = "hello, world"
c <- 0
}
func main() {
go f()
<-c
print(a)
}
从单个 goroutine 的角度来看,断言是正确的,但是从另一个 goroutine 的角度来看,不能从文本迄今为止提到的保证中推断出来。
所以我的问题是:是否还有其他未在本文档中明确说明的保证?例如,我们可以说给定一些同步原语,例如在通道上发送,确保放置在它之前的命令不会被编译器移动到它之后吗?那么后面的命令呢,我们可以说它们不会放在同步原语之前吗?
原子包中提供的操作怎么样?它们是否提供与渠道运营相同的保证?
【问题讨论】:
-
“是否有其他未在本文档中明确说明的保证” 否。规范和内存模型准确地说明了语言的预期。
标签: go concurrency race-condition goroutine memory-model