如何理解独立式C或C++实现中的原子?

mrn*_*mrn 5 c c++ c++11 c11

C11和C++ 11根据执行线程定义原子.而在托管环境中,很清楚线程是什么,在独立式语言实现中它是一个模糊的术语.

  1. 如何在独立实现中正式理解C11和C++ 11中指定的原子,其中所有线程必须在程序内实现?例如:ISR是一个单独的执行线程吗?
  2. 为什么标准委员会根据线程而不是简单地在代码排序领域定义原子?
  3. 除了gcc之外,还有哪些嵌入式编译器已经支持C11/C++ 11原子?

Pet*_*ker 5

我对这类问题有点机械(有点手摇)的方法是原子保证三件事:读取和写入不会被上下文切换破坏(所以你只能看到实际存储在变量中的值);缓存被刷新(所以你看不到陈旧的值);并且编译器无法在原子操作中移动指令(因此在原子访问之前逻辑上发生的操作实际上发生在该访问之前)。请注意,我在这里试图避免任何“线程”的概念,尽管它有点费力。

如果您正在编写自己的线程机制,这些属性显然很重要。它们与您正在使用的线程机制的细节正交。

对于信号处理程序,当您需要检查信号处理程序中执行的代码中的值以及信号处理程序需要修改程序其余部分关心的值时,它们为您提供了一个立足之地。

我不确定标准是否正式解决了 ISR(很确定它没有),但从这个机制的角度来看,ISR 与不是来自raise. 它只是一个异步函数调用,它占用了从被中断线程获得的堆栈空间。这绝对不是一个线程;它是现有线程上的寄生虫。因此,对于 ISR,我会使用信号的保证而不是线程的保证。