x86-64 では、クリティカル セクションに単純なスピンロックを使用します。
mov al,1
LoopWait:
xchg byte ptr[mlock], al
test al,al
jz Free
pause
jmp LoopWait
Free:
cs を終了するには:
mov byte ptr[mlock], 0
クリティカル セクション内のストア操作がフラッシュされるように、ロックを解除する前にフェンス命令が必要ですか?
x86-64 では、クリティカル セクションに単純なスピンロックを使用します。
mov al,1
LoopWait:
xchg byte ptr[mlock], al
test al,al
jz Free
pause
jmp LoopWait
Free:
cs を終了するには:
mov byte ptr[mlock], 0
クリティカル セクション内のストア操作がフラッシュされるように、ロックを解除する前にフェンス命令が必要ですか?
私は意図的にあなたのコードの正確性をチェックしていません:
スピンロックはすでに「メモリ フェンス」であり (部分的なメモリ フラッシュを行うだけなので、実際にはメモリ フェンスではありません)、既に読み取りと書き込みを同期しています (そうでなければ機能しません)。したがって、スピンロックが正しく機能している場合は、追加のメモリ フェンスが必要になることはありません (無駄なペナルティになるだけです)。
これは概念的な問題です。そのようなもの、特に単一のアセンブリ命令の「メモリ コントラクト」を実装するときは、アーキテクチャの詳細を知っておく必要があります。
メモリ フェンスには他の目的があります (C++ のオブジェクトを非同期コードで使用する前に完全に初期化できるようにするなど)。