这些锁定的内存访问是否相同?

时间:2013-01-22 14:07:29

标签: c++ multithreading x86 atomic

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的编译器语义再次发生了变化。

1 个答案:

答案 0 :(得分:2)

大概是的。第一种情况下的lock or确保在任何其他CPU可以读取更多内存之前已更新数据,在第二种情况下,xchg指令具有隐式锁定,因此所有其他处理器(在处理器更新值之前,必须“释放”它们的* ptr值。