c++ - 这些锁定的内存访问是否等效?

标签 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);
}

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

编辑:我目前使用的是 VS2010,但可能会移植到 VS2012,我相信有关 volatile 的编译器语义再次发生了变化。

最佳答案

大致上是的。第一种情况下的 lock 或 可确保在任何其他 CPU 读取更多内存之前数据已更新,在第二种情况下,xchg 指令具有隐式锁定,因此所有其他处理器(核心)都必须“释放”它们的 *ptr 值,然后您的处理器才能更新该值。

关于c++ - 这些锁定的内存访问是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14460454/

相关文章:

android - libGDX 的 Looper 错误

c++ - 尝试使用移动语义创建线程 guard

组装 ADC(带进位的加法)

x86 - 将两个 32 位整数向量相乘,生成一个 32 位结果元素向量

c - 基于汇编32位(x86)编写C代码

C++ 动态矩阵乘法返回问题

c++ - boost 变体复制语义

.net - 多线程: At what point have you created too many threads?

c++ - 使用 PugiXML 进行 XML 解析,无限循环

c++ - C++ 可以消除异常对象类型的歧义吗?