3

这可以原子地完成吗?

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

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

gcc atomic extensionvoid __atomic_store (type *ptr, type *val, int memmodel)看起来能够以原子方式进行加载和存储。

4

1 回答 1

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标志,然后使用C++atomics

于 2013-05-16T01:09:50.357 回答