我对这类问题有点机械(有点手摇)的方法是原子保证三件事:读取和写入不会被上下文切换破坏(所以你只能看到实际存储在变量中的值);缓存被刷新(所以你看不到陈旧的值);并且编译器无法在原子操作中移动指令(因此在原子访问之前逻辑上发生的操作实际上发生在该访问之前)。请注意,我在这里试图避免任何“线程”的概念,尽管它有点费力。
如果您正在编写自己的线程机制,这些属性显然很重要。它们与您正在使用的线程机制的细节正交。
对于信号处理程序,当您需要检查信号处理程序中执行的代码中的值以及信号处理程序需要修改程序其余部分关心的值时,它们为您提供了一个立足之地。
我不确定标准是否正式解决了 ISR(很确定它没有),但从这个机制的角度来看,ISR 与不是来自raise. 它只是一个异步函数调用,它占用了从被中断线程获得的堆栈空间。这绝对不是一个线程;它是现有线程上的寄生虫。因此,对于 ISR,我会使用信号的保证而不是线程的保证。