这可以原子方式完成吗?
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)
,看起来能够同时加载和存储原子。
答案 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
。