C++ 是否可以在X86处理器上自动加载和存储?

C++ 是否可以在X86处理器上自动加载和存储?,c++,concurrency,x86,atomic,processor,C++,Concurrency,X86,Atomic,Processor,这可以原子化吗 void load_and_store(int* dst, int* src) { int data = *src; *dst = data; } 如果原子存储必须使用XCHG[addr],EAX完成,我必须首先将数据加载到EAX中。然后加载和存储不是原子的 gcc原子扩展具有void\uuu原子存储(type*ptr,type*val,int memmodel),它看起来能够以原子方式进行加载和存储。我不相信x86上有任何指令能够以原子方式对不同的地址进行加载和存储。

这可以原子化吗

void load_and_store(int* dst, int* src) {
  int data = *src;
  *dst = data;
}
如果原子存储必须使用
XCHG[addr],EAX
完成,我必须首先将数据加载到
EAX
中。然后加载和存储不是原子的


gcc原子扩展具有
void\uuu原子存储(type*ptr,type*val,int memmodel)
,它看起来能够以原子方式进行加载和存储。

我不相信x86上有任何指令能够以原子方式对不同的地址进行加载和存储。(我不确定是否有其他体系结构,但我怀疑有很多(如果有的话)是这样的。它没有任何有用的价值,而且会很昂贵。)

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

gnu原子存储(type*ptr,type*val,int-memmodel)并不像您想象的那样。看见它所做的是将
val
加载到一个寄存器(或者其他什么东西(它实际上没有定义它对val的作用))中,然后将值自动存储到
ptr
给出的内存位置

在x86上,对齐的加载和存储(对于32位及以下的值)默认是原子的


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

这与
*dst=*src?*dst=*src不是原子的。@MarkB也许我的问题有点让人困惑。我想知道是否有一个CPU指令,它与C++中的函数一样,以原子方式进行。查看CopraySand(),X8664上的“单个内存位置”有多大?它最多是64位还是32位?在x86-64中,对齐的8位、16位、32位和64位加载和存储是原子的。未对齐的16位、32位和64位加载和存储可能不是原子的。还有一条cmpxchg16b指令可以与128位对齐。我不知道还有任何其他指令能在宽度超过64位的情况下自动工作。