这些锁定的内存访问是等价的吗?

Are these locked memory accesses equivalent?

本文关键字:访问 锁定 内存      更新时间:2023-10-16
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);
}

在语义上等价。显然,无论是否指定lock前缀,xchg都将被锁定。

编辑:我目前使用VS2010,但可能会移植到VS2012,我相信关于volatile的编译器语义已经再次改变。

大致是的。在第一种情况下,lock or确保在任何其他CPU可以读取更多内存之前数据已经更新,在第二种情况下,xchg指令有一个隐式锁,因此所有其他处理器(核心)将不得不"释放"它们的*ptr值,然后处理器才能更新该值。