我知道添加数字的操作是一条指令。它不应该被打断。那为什么不添加原子操作呢?为什么我们需要互斥锁?
答案 0 :(得分:1)
请考虑以下代码:
void add(int *dst, int src)
{
*dst += src;
}
在ARM64上编译为:
ldr w2, [x0]
add w1, w2, w1
str w1, [x0]
ret
ARM64没有在内存上运行的“add”指令,只在寄存器上运行,因此必须使用3条指令实现加法:加载,添加,存储。
在x86-64上,它编译为:
add DWORD PTR [rdi], esi
ret
所以这是一条指令,但要执行它,Intel cpu会将此指令内部拆分为内部执行引擎的3个微指令:load-add-store。所以这两种架构没有区别。
此外,cpus使用write buffer来提高内存操作的性能。最后一个存储将被缓冲,因此实际写入内存的时间会延迟,并且有足够的时间让其他cpu修改该值。
如果你需要原子地添加,处理器提供了一些以原子方式执行简单操作的方法,因此不需要互斥。
英特尔有lock
前缀,因此您可以执行lock add
。自ARMv8.1起ARM64具有STADD
之前,可以使用ldxr
和stxr
的组合。