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
が再び変更されたと思われます。