不带LOCK前缀的CMPXCHG指令的用途? [重复]

问题描述 投票:4回答:1

我正在阅读英特尔开发人员手册的Vol 3a:

http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html

并且在第245页上,这意味着只有XCHG指令具有自动总线锁定功能。诸如XADDCMPXCHG之类的指令不会自动锁定系统总线,因此您需要在LOCK前面加上前缀。对我来说,这表明指令本身并不是跨多个CPU内核的原子。

那么,如果这些说明不是原子的,那么它们的目的是什么?

在阅读手册之前,我希望这些指令本质上在CPU级别是原子的。我认为这是结合使用“比较”和“设置”功能的原因。

编辑:

原因可能是在单个CPU内核上强制执行原子性?

multithreading x86 cpu atomic compare-and-swap
1个回答
-1
投票

编译器可以优化条件集,例如

if (n == 42) { n = 2 };

插入CMPXCHG(没有LOCK前缀,如果实际上更快)。

此外,CMPXCHG在单处理器系统上是原子的,在该系统上,您仍然需要针对中断进行同步(这些中断与内核上当前正在运行的代码同时执行)。

您可以向我了解CMPXCHG中不带LOCK前缀的Peter Cordes's answer.的用例。

© www.soinside.com 2019 - 2024. All rights reserved.