2
void f1(volatile int* ptr, int value)
{
    *ptr = value;
    lock or DWORD PTR [rsp], 0; // MemoryBarrier()
}


void f2(volatile int* ptr, int value)
{
    xchg DWORD PTR [ptr], value; // InterlockedExchange(ptr, value);
}

セマンティクスに関しては同等です。プレフィックスが指定さxchgれているかどうかに関係なく、明らかにロックされています。lock

編集:現在VS2010を使用していますが、おそらくVS2012に移植され、コンパイラのセマンティクスvolatileが再び変更されたと思われます。

4

1 に答える 1

2

おおむねそうです。最初のlock orケースでは、他の CPU がメモリを読み取る前にデータが更新されていることを確認します。2 番目のケースでは、xchg命令に暗黙的なロックがあるため、他のすべてのプロセッサ (コア) は値を「解放」する必要があります。プロセッサが値を更新する前に、*ptr の

于 2013-01-22T14:16:23.707 に答える