是否有可能以原子方式加载和存储在X86处理器上?

时间:2013-05-15 23:45:49

标签: c++ concurrency x86 atomic processor

这可以原子方式完成吗?

void load_and_store(int* dst, int* src) {
  int data = *src;
  *dst = data;
}

如果必须使用XCHG [addr], EAX完成原子商店,我必须首先将数据加载到EAX。然后加载和存储不是原子的。

gcc原子扩展具有void __atomic_store (type *ptr, type *val, int memmodel),看起来能够同时加载和存储原子。

1 个答案:

答案 0 :(得分:6)

我不相信x86上有任何指令原子地对加载和存储执行不同的地址。 (我不确定其他架构,但我怀疑有很多,如果有的话。它没有任何有用价值,而且价格昂贵。)

x86(和x86_64)有许多指令可用于执行原子读 - 修改 - 写操作,但仅限于单个内存位置。例如BTS进行测试和设置。 XCHG将寄存器中的值与内存位置中的值进行交换。 XADD执行原子增量。 CMPXCHG进行比较和交换。默认情况下,这些都不是原子的,但可以通过在汇编指令中添加LOCK前缀来实现原子。

gnu __atomic_store(type *ptr, type *val, int memmodel)没有按照你的想法做到。见http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html。它的作用是将val加载到寄存器中(或其他东西(它实际上没有定义它对val的作用))然后以原子方式将值存储到ptr给出的内存位置。

在x86上对齐默认情况下,加载和存储(对于32位或更少的值)是原子的。

但除非必须,否则你不应该使用gnu内置。而是使用--std=c++11标志,然后使用the C++ atomics