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值,然后处理器才能更新该值。