var condition bool
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(item) {
if meetsCondition(item) {
condition = true
}
wg.Done()
}(item)
}
wg.Wait()
// is it safe to check condition here?
老go论坛上有一个关于这个问题的讨论:https://groups.google.com/forum/#!topic/golang-nuts/5oHhhzXCcmM答案是肯定的,它是安全的。然后讨论就跑题了atomic的使用等等,这不是我想问的。
规范中甚至没有提到 WaitGroup,它的文档说 WaitGroup.Wait:“等待块,直到 WaitGroup 计数器为零。”这确实
没有设置任何发生之前的关系(或者是吗?)。
这是否意味着第一个答案“wg.Wait 返回后检查条件是安全的”是非官方的?如果是官方的,我失踪的原因是什么?如果您回答的话,非常感谢。
Update:这是@peterSO 的@ravi 的回答后的更新。谢谢。
嗯,显然,如果您选择的项目数 > 1,则可能会出现竞争条件。提示:条件只能设置为 true。尽管如此,我还是有同样的问题。
也许,我应该指出:
- 底层架构只能是x86、x64或ARM
- 项目数量可以是 1
Update 2我在这里为项目数 == 1 的情况创建了后续问题:你能让这个“不正确同步”的测试失败吗?
是的。之间存在happens-before关系wg.Wait()
and wg.Done()
。这个简单的事实是出于 doc 或 go MM 中未提及的任何原因#7948。感谢伊恩·兰斯·泰勒的澄清golang-坚果/5oHzhzXCcmM。关于竞争条件,您可以在同一线程中阅读更多内容。
有点令人失望的是,在一种自称为并发的语言中,必须依靠一个“好词”来完成基本的工作(右)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)