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() の間には暗黙的な前発生関係があります。ゴルーチンが wg.Done() を呼び出すと、完了したすべての操作が、すでに wg.Wait() を呼び出している他のゴルーチンから見えるようになります。したがって、wg.Wait() は効果的にメモリ バリアとして機能し、wg.Wait() が戻った後のチェックの前に条件変数が更新されるようにします。
この事前発生関係は明示的に文書化されていませんが、文書化されています。 Go開発者によって確認されました。詳細については、こちらの Go フォーラムのスレッドを参照してください。
以上がWaitGroup.Wait() は Go のメモリバリアとして機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。