あなたの例はうまくいくでしょう。
複数のプロセッサは、MESIなどのコヒーレンシ プロトコルを使用して、キャッシュ間でデータの同期を維持します。MESI では、各キャッシュ ラインは、変更されているか、排他的に保持されているか、CPU 間で共有されているか、または無効であると見なされます。プロセッサ間で共有されるキャッシュ ラインを書き込むと、他の CPU では強制的に無効になり、キャッシュの同期が維持されます。
しかし、これでは十分ではありません。プロセッサーが異なればメモリー・モデルも異なり、最新のプロセッサーのほとんどは、メモリー・アクセスの順序変更をある程度サポートしています。このような場合、メモリバリアが必要です。
たとえば、スレッド A がある場合:
DoWork();
workDone = true;
そしてスレッドB:
while (!workDone) {}
DoSomethingWithResults()
両方が別々のプロセッサで実行されているため、DoWork() 内で行われた書き込みが、workDone への書き込みと DoSomethingWithResults() が一貫性のない状態で続行される前にスレッド B に表示されるという保証はありません。メモリ バリアは、読み取りと書き込みの順序をある程度保証します。スレッド A の DoWork() の後にメモリ バリアを追加すると、DoWork によって行われたすべての読み取り/書き込みが、workDone への書き込みの前に完了し、スレッド B が一貫したビューを取得できるようになります。ミューテックスは本質的にメモリバリアを提供するため、読み取り/書き込みはロックとロック解除の呼び出しを渡すことができません。
あなたの場合、あるプロセッサが他のプロセッサにキャッシュラインを汚したことを通知し、他のプロセッサにメモリからのリロードを強制します。値を読み書きするミューテックスを取得することで、メモリへの変更が期待される順序で他のプロセッサに表示されることが保証されます。