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
已经再次改变。