3

msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspxでは、MemoryBarrier は xchg の呼び出しとして実装されています。

// x86

FORCEINLINE
VOID
MemoryBarrier (
    VOID
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}

「Software Developer's Manual」に資料が見つかりません。私にその理由を教えてください。

4

2 に答える 2

4

ここで 2 つのことが起こります。

  1. コンパイラには、出力命令ストリームに挿入する不透明なブロックが与えられます。ブロック内でアクセスされるデータがわからないため、その周りの他のステートメントを並べ替えることができません。

  2. このxchg命令は、アトミックな読み取り-変更-書き込み操作を実行します。これにはメモリ バスでの順序付けが必要なため、CPU はメモリ バリアを適用します。

于 2013-10-29T08:15:29.537 に答える
3

Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3: "System Programming Guide" より

8.2.5「メモリー順序付けモデルの強化または弱体化」

マルチプロセッサ システムの同期メカニズムは、強力なメモリ順序付けモデルに依存する場合があります。ここで、プログラムは XCHG 命令や LOCK プレフィックスなどのロック命令を使用して、メモリに対する読み取り-変更-書き込み操作がアトミックに実行されるようにすることができます。ロック操作は通常、前のすべての命令が完了し、バッファリングされたすべての書き込みがメモリに排出されるまで待機するという点で、I/O 操作のように動作します(セクション8.1.2「バスロック」を参照)。

そして8.1.2から:

ロックされた操作は、他のすべてのメモリ操作および外部から見えるすべてのイベントに関してアトミックです。ロックされた命令を渡すことができるのは、命令フェッチとページ テーブル アクセスのみです。ロックされた命令を使用して、あるプロセッサによって書き込まれたデータと別のプロセッサによって読み取られたデータを同期させることができます。

P6 ファミリ プロセッサの場合、ロックされた操作は、すべての未処理のロードおよびストア操作をシリアル化します (つまり、それらが完了するのを待ちます)。この規則は、1 つの例外を除いて、Pentium 4 および Intel Xeon プロセッサにも当てはまります。弱い順序付けのメモリ タイプ (WC メモリ タイプなど) を参照するロード操作は、シリアル化されない場合があります。

于 2013-10-29T08:19:37.607 に答える