【问题标题】:Purpose of CMPXCHG instruction without LOCK prefix? [duplicate]没有 LOCK 前缀的 CMPXCHG 指令的目的? [复制]
【发布时间】:2014-10-12 11:17:34
【问题描述】:

我正在阅读英特尔开发人员手册的第 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 内核上强制执行原子性??

【问题讨论】:

  • 它支持在具有强大内存模型的处理器上进行无锁编程的圣杯。 this post 覆盖得很好。
  • 为什么无锁编程不需要LOCK前缀?从您的链接看来,指令在该 CPU 上是原子的,但不是就多个 CPU/内核而言?
  • 查看我对链接副本的回答,它正在回答这个确切的问题。 (虽然我不确定我发布的原始问题是为了问这个问题。哎呀:P)

标签: multithreading x86 cpu atomic compare-and-swap


【解决方案1】:

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

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

转换成 CMPXCHG(不带 LOCK 前缀),如果这实际上更快的话。

此外,CMPXCHG 在单处理器系统上是原子的,您仍然需要针对中断进行同步(可以在任意两条指令之间触发,但不能在一条指令的中间触发)核心)。

您可以在Peter Cordes's answer. 中阅读有关CMPXCHG 不带LOCK 前缀的用例

【讨论】:

  • 怎么样?除非您实际展示程序集,否则这不是一个很好的示例。
  • 有趣的地方。通常无分支代码最终会无条件地写入旧值或新值(例如 load/cmov/store 或 SIMD 加载/混合/存储)。但我认为没有lockcmpxchg 确实是一个条件存储,至少根据手册。 felixcloutier.com/x86/cmpxchg。因此,它不会通过在比较失败的情况下引入非原子读/重写来“发明写入”。 (如果是这样,如果另一个线程同时写入n,那将是不安全的。存储可能会跟随另一个线程的存储并踩到它。)
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 2012-06-19
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多