use*_*112 5 cpu x86 multithreading atomic compare-and-swap
我正在阅读英特尔开发人员手册的第 3a 卷:
在第 245 页,它暗示只有XCHG指令具有自动总线锁定功能。诸如XADD和 之类的指令CMPXCHG不会自动锁定系统总线,为此您需要以LOCK.为前缀。对我来说,这表明单独的指令不是跨多个 CPU 内核的原子。
那么这些指令的目的是什么,如果它们不是原子的呢?
在我阅读手册之前,我预计这些指令在 CPU 级别本质上是原子的。我认为这就是结合“比较”和“设置”功能的原因。
编辑:
原因可能是在单个 CPU 内核上强制执行原子性??
编译器可以优化条件集,例如
if (n == 42) { n = 2 };
Run Code Online (Sandbox Code Playgroud)
进入 a CMPXCHG(不带LOCK前缀),如果这实际上更快的话。
此外,CMPXCHG在单处理器系统上是原子的,您仍然需要针对中断进行同步(中断可以在任意两条指令之间触发,但不能在核心上的一条指令中间触发)。
CMPXCHG您可以在 Peter Cordes 的回答中阅读有关不带LOCK前缀的用例的信息。