【发布时间】:2020-06-17 19:15:30
【问题描述】:
我在看官方文档,有一段代码看不懂。
var a string
var done bool
func setup() {
a = "hello, world"
done = true
}
func doprint() {
if !done {
once.Do(setup)
}
print(a)
}
func twoprint() {
go doprint()
go doprint()
}
这个版本可以(错误地)打印一个空字符串而不是“hello, world”。
为什么这段代码会产生错误的结果。
【问题讨论】:
-
这段代码来自哪里?这没有任何意义 -
once没有被声明为开始。 -
@AJR 代码取自The Go Memory Model,
once是sync.Once的一个实例。压力在于不正确的同步。 -
@icza 在那种情况下我明白了。令人困惑的是,特定问题是
done上的数据竞争,与once无关。顺便说一句,我赞成您的回答并删除了我愚蠢的回答。
标签: go concurrency