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 可以读取更多内存之前数据已更新,在第二种情况下,xchg指令具有隐式锁定,因此所有其他处理器(内核)将不得不“释放”它们的值*ptr 在你的处理器可以更新值之前。

于 2013-01-22T14:16:23.707 回答