このコードでは、ロックとロック解除が正確にはわかりません。それらはミューテックス操作であると推測しています。powerpc では、mutex 取得関数は isync を使用し (ハードウェアが lock() の前に if (!pInst) を評価する可能性があります)、unlock() に lwsync (または、mutex 実装が古い場合は sync) があります。 .
したがって、pInst へのすべてのアクセス (読み取りと書き込みの両方) がロックおよびロック解除メソッドによって保護されていると仮定すると、バリアの使用は冗長になります。ロック解除には、ロック解除操作が完了する前に pInst ストアが確実に見えるようにするための十分なバリアがあります (同じロックが使用されていると仮定して、後続のロックの取得後に pInst ストアが見えるようになります)。
x86 および x64 では、lock() は何らかの形式の LOCK プレフィックス付き命令を使用し、自動的に双方向フェンシング動作を行います。
x86 および x64 でのロック解除はストア命令のみである必要があります (CS 内で特別な文字列命令を使用しない限り、その場合は SFENCE が必要になります)。
マニュアル:
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf
すべてのフェンスと LOCK 接頭辞の効果 (およびそれが暗示される場合) に関する優れた情報があります。
ps。ロック解除コードには、コンパイラの順序付けを強制するものも必要です (ストア ゼロの場合は、GCC スタイルのasm _ volatile _ ( "" ::: "memory" )のようなものも必要になります)。 )。