woo*_*ngs 3 c++ concurrency x86 processor atomic
这可以原子地完成吗?
void load_and_store(int* dst, int* src) {
int data = *src;
*dst = data;
}
Run Code Online (Sandbox Code Playgroud)
如果必须完成原子存储XCHG [addr], EAX,我将不得不首先加载数据EAX.然后加载和存储不是原子的.
gcc原子扩展void __atomic_store (type *ptr, type *val, int memmodel)看起来像能够以原子方式加载和存储.
我不相信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.