C11和C ++ 11根据执行线程定义原子。在托管环境中,很清楚线程是什么,在独立语言实现中它是一个模糊的术语。
答案 0 :(得分:3)
Atomics是为了应对竞争条件,所以没有线程他们几乎没有任何意义。可能发生比赛的唯一其他背景是信号处理程序,C标准提供了锁定的概念。
看来,独立环境和托管环境之间没有区别。线程和原子是可选功能,如果独立环境支持两者,则必须符合两者的规范。如果它只支持原子,它可以为信号处理程序提供无锁原子类型,但其他原子类型则无用。
答案 1 :(得分:3)
我对这类问题的一些机制(并且有点牵手)方法是原子学保证三件事:读取和写入不会被上下文切换所撕裂(所以你只能看到实际存储在变量中的值) ;缓存被刷新(所以你没有看到过时的值);并且编译器不能跨原子操作移动指令(因此在原子访问之前逻辑上发生的操作实际上发生在该访问之前)。请注意,我试图避免使用“线程”的任何概念,尽管它有点费力。
如果您正在编写自己的线程机制,那么这些属性显然非常重要。它们与您正在使用的线程机制的细节正交。
对于信号处理程序,当您需要检查信号处理程序中执行的代码中的值以及信号处理程序需要修改程序其余部分所关注的值时,它们会为您提供一个站立位置。
我不确定该标准是否正式解决了ISR(很确定它没有),但从这种机制的角度来看,ISR与不是来自{{1}的呼叫的信号没有区别}。它只是一个异步函数调用,它占用了从被中断的线程获得的堆栈空间。它肯定是不一个线程;它是现有线程上的寄生虫。因此,对于ISR,我会考虑信号的保证而不是线程的保证。