一般来说,对于 int num
,作为读-修改-写操作的 num++
(或 ++num
)是 不是原子弹。但是我经常看到编译器,例如 海湾合作委员会,为它生成以下代码(试试这里) :
void f()
{
int num = 0;
num++;
}
f():
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 0
add DWORD PTR [rbp-4], 1
nop
pop rbp
ret
因为对应于 num++
的第5行是一条指令,我们可以得出 num++
是原子弹在这种情况下的结论吗?
如果是这样,那么 这是否意味着生成的 num++
可以在并发(多线程)场景中使用,而不存在任何数据竞争的危险(也就是说,我们不需要使它,例如,std::atomic
并强加相关的成本,因为它是原子级的) ?
更新
请注意,这个问题是 没有是否增量 是原子(它不是,这是问题的开始行)。问题在于 可以是否在特定的场景中使用,也就是说,在某些情况下是否可以利用单指令的特性来避免 lock
前缀的开销。而且,正如公认的答案在关于单处理器机器以及 这个答案的章节中提到的那样,其注释和其他解释中的对话是 可以的(尽管不是用 C 或 C + +)。