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
的编译器语义再次发生了变化。
答案 0 :(得分:2)
大概是的。第一种情况下的lock or
确保在任何其他CPU可以读取更多内存之前已更新数据,在第二种情况下,xchg
指令具有隐式锁定,因此所有其他处理器(在处理器更新值之前,必须“释放”它们的* ptr值。