执行比较和交换指令时微处理器是否禁用中断?

Do microprocessors disable interrupts while compare and swap instructions are executed?

compare and swap instruction 执行时,1.4 GHz Intel Core i5(64 位)CPU 是否禁用中断?

换句话说,如果我有 std::atomic<int> atom_int;,这是否意味着在 atom_int++; 期间无法传递信号(SIGINTSIGSTPSIGKILL)到流程?

我了解它的 CPU 具体问题,并希望得到任何具体 CPU 的答案。

英特尔 CPU(有效地)在执行所有指令时禁用中断——中断只能在 条指令之间传递。现在指令的执行可能会在时间上重叠(混淆between的意思),但是中断机制的工作方式,中断之前的每条指令都会完成,而中断之后的每条指令将被取消(所以没有影响)。

请注意,仅仅因为不能在指令中间传递中断,如果指令包含多个内存访问(例如a inc mem 有效地执行读-修改-写),因为连接到总线的其他 CPU 或其他设备可能会修改其间的位置。这就是 lock 前缀的作用——它保证在指令为 运行.

时该内存位置不会发生任何其他事情

以下两件事不一定相同:

  1. C++ 级别的原子操作 (std::atomic)
  2. 汇编程序 CPU 保证原子性的指令

例如,现代英特尔处理器保证 64 位 reads/writes 到 64 位对齐地址是原子的。它还保证以原子方式执行带有 LOCK 前缀的指令。

另一方面,在 C++ 中,std::atomic 保证对对象的操作是原子执行的。如果可能的话,一个好的编译器将为此使用单个原子 CPU 指令。但是,对于较大的对象,这种原子性无法通过单个原子 CPU 指令来实现。所以原子性只能通过使用更复杂的同步方式来保证,比如locks。这种复杂的同步方法需要几个 CPU 指令,因此总是会被中断。

您可以通过调用std::atomic::is_lock_free()来判断std:atomic是否正在使用锁。