1

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

クリティカル セクション内のストア操作がフラッシュされるように、ロックを解除する前にフェンス命令が必要ですか?

4

1 に答える 1

0

私は意図的にあなたのコードの正確性をチェックしていません:

スピンロックはすでに「メモリ フェンス」であり (部分的なメモリ フラッシュを行うだけなので、実際にはメモリ フェンスではありません)、既に読み取りと書き込みを同期しています (そうでなければ機能しません)。したがって、スピンロックが正しく機能している場合は、追加のメモリ フェンスが必要になることはありません (無駄なペナルティになるだけです)。

これは概念的な問題です。そのようなもの、特に単一のアセンブリ命令の「メモリ コントラクト」を実装するときは、アーキテクチャの詳細を知っておく必要があります。

メモリ フェンスには他の目的があります (C++ のオブジェクトを非同期コードで使用する前に完全に初期化できるようにするなど)。

于 2015-10-15T12:49:24.783 に答える