WaitGroup.Wait() 保证内存屏障吗?
考虑以下代码片段:
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?
出现了在 wg.Wait() 返回后检查条件变量是否安全的问题。 Go 官方文档没有明确提及任何内存屏障影响,但 WaitGroup 文档指出,Wait 会阻塞,直到等待组计数器达到零。
解决方案
是的,在 wg.Wait() 返回后检查条件变量是安全的。 wg.Wait() 和 wg.Done() 之间存在隐式的happens-before关系。当一个 goroutine 调用 wg.Done() 时,它确保其所有已完成的操作对于已调用 wg.Wait() 的其他 goroutine 可见。因此,wg.Wait() 有效地充当内存屏障,确保在 wg.Wait() 返回后检查之前更新条件变量。
这种发生之前关系没有明确记录,但已被记录得到了 Go 开发者的确认。请参阅此处的 Go 论坛主题了解更多详细信息。
以上是WaitGroup.Wait() 在 Go 中充当内存屏障吗?的详细内容。更多信息请关注PHP中文网其他相关文章!