执行比较和交换指令时微处理器是否禁用中断?
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++;
期间无法传递信号(SIGINT
、SIGSTP
、SIGKILL
)到流程?
我了解它的 CPU 具体问题,并希望得到任何具体 CPU 的答案。
英特尔 CPU(有效地)在执行所有指令时禁用中断——中断只能在 条指令之间传递。现在指令的执行可能会在时间上重叠(混淆between的意思),但是中断机制的工作方式,中断之前的每条指令都会完成,而中断之后的每条指令将被取消(所以没有影响)。
请注意,仅仅因为不能在指令中间传递中断,如果指令包含多个内存访问(例如a inc mem
有效地执行读-修改-写),因为连接到总线的其他 CPU 或其他设备可能会修改其间的位置。这就是 lock
前缀的作用——它保证在指令为 运行.
时该内存位置不会发生任何其他事情
以下两件事不一定相同:
- C++ 级别的原子操作 (std::atomic)
- 汇编程序 CPU 保证原子性的指令
例如,现代英特尔处理器保证 64 位 reads/writes 到 64 位对齐地址是原子的。它还保证以原子方式执行带有 LOCK 前缀的指令。
另一方面,在 C++ 中,std::atomic
保证对对象的操作是原子执行的。如果可能的话,一个好的编译器将为此使用单个原子 CPU 指令。但是,对于较大的对象,这种原子性无法通过单个原子 CPU 指令来实现。所以原子性只能通过使用更复杂的同步方式来保证,比如locks。这种复杂的同步方法需要几个 CPU 指令,因此总是会被中断。
您可以通过调用std::atomic::is_lock_free()
来判断std:atomic
是否正在使用锁。
当 compare and swap instruction 执行时,1.4 GHz Intel Core i5(64 位)CPU 是否禁用中断?
换句话说,如果我有 std::atomic<int> atom_int;
,这是否意味着在 atom_int++;
期间无法传递信号(SIGINT
、SIGSTP
、SIGKILL
)到流程?
我了解它的 CPU 具体问题,并希望得到任何具体 CPU 的答案。
英特尔 CPU(有效地)在执行所有指令时禁用中断——中断只能在 条指令之间传递。现在指令的执行可能会在时间上重叠(混淆between的意思),但是中断机制的工作方式,中断之前的每条指令都会完成,而中断之后的每条指令将被取消(所以没有影响)。
请注意,仅仅因为不能在指令中间传递中断,如果指令包含多个内存访问(例如a inc mem
有效地执行读-修改-写),因为连接到总线的其他 CPU 或其他设备可能会修改其间的位置。这就是 lock
前缀的作用——它保证在指令为 运行.
以下两件事不一定相同:
- C++ 级别的原子操作 (std::atomic)
- 汇编程序 CPU 保证原子性的指令
例如,现代英特尔处理器保证 64 位 reads/writes 到 64 位对齐地址是原子的。它还保证以原子方式执行带有 LOCK 前缀的指令。
另一方面,在 C++ 中,std::atomic
保证对对象的操作是原子执行的。如果可能的话,一个好的编译器将为此使用单个原子 CPU 指令。但是,对于较大的对象,这种原子性无法通过单个原子 CPU 指令来实现。所以原子性只能通过使用更复杂的同步方式来保证,比如locks。这种复杂的同步方法需要几个 CPU 指令,因此总是会被中断。
您可以通过调用std::atomic::is_lock_free()
来判断std:atomic
是否正在使用锁。