相互排除パターンの正確さは、割り当て _flag=false がアトミックであるかどうかによって異なります。割り当てが別のスレッドによって中断される可能性がある場合に何が起こるか想像してみてください。割り当ての中間結果がテストによって false と解釈される可能性がある場合、1 つの割り当てによって複数のスレッドがクリティカル セクションに入る可能性があります。
相互排除パターンの正確性は、ステートメントの順序を再配置する可能性があるコンパイラーの最適化がないことにも依存します。間にあるコードでは _flag が参照されないため (そして、間にあるコードは例外をスローしないため)、割り当て _flag=false を上に移動する "スマート" コンパイラを想像してみてください。次に、コンパイラはロックセクションの部分を最適化して読み取ることができます
if(_flag) return;
パターンが失敗する可能性がある理由の両方の例は、非常に推測に基づくものであり、それが機能すると想定しても問題ないと思います。ただし、必要に応じて機能する別のオプションが存在する場合は、それを使用することをお勧めします (他の投稿を参照)。同じコードに他の開発者がいる場合、パターンが機能するかどうかを考慮する必要はありません。