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 或
可确保在任何其他 CPU 读取更多内存之前数据已更新,在第二种情况下,xchg
指令具有隐式锁定,因此所有其他处理器(核心)都必须“释放”它们的 *ptr 值,然后您的处理器才能更新该值。
关于c++ - 这些锁定的内存访问是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14460454/