在 Go Memory Model 文档http://golang.org/ref/mem 中,它给出了以下示例:
var a string
var done bool
func setup() {
a = "hello, world"
done = true
}
func main() {
go setup()
for !done {
}
print(a)
}
然后它说明了这个例子的以下内容。
“无法保证 main 会观察到对 done 的写入,因为两个线程之间没有同步事件。main 中的循环不能保证完成。”
因此,如果main可能没有观察到对done变量的写入,这似乎表明setup()函数永远不会运行。那是对的吗?如果是这样,是不是因为程序被重新排序以在for !done {}循环之后移动go setup()?或者会不会有其他原因?
我假设如果go setup()语句实际上能够执行,那么将保证调用setup()函数并设置done。那正确吗?
谢谢你。
慕勒3428872
眼眸繁星
相关分类