C 11原子:将它们与内存映射I / O一起使用是否有意义,甚至可能?

据我所知,C volatile和可选的内存asm for memory fence已用于在内存映射I / O之上实现设备驱动程序.在Linux内核中可以找到几个例子.

如果我们忘记未捕获的异常(如果有的话)的风险,用C 11原子替换它们是否有意义?或者,它有可能吗?

最佳答案
通常,您可以将内存替换为原子,但不能替换为volatile,除非它与专门用于线程间通信的fence一起使用.

对于内存映射I / O而言,原子论不够的原因是:

> volatile保证程序中对该变量的所有内存访问都会确实发生,并且它们按照您指定的顺序发生(在单个线程中).
> std :: atomic只保证你的程序会像所有那些内存访问一样发生(根据C的内存模型,它不知道内存映射的I / O)和 – 取决于指定的内存排序 – 如如果它们按指定顺序发生.

实际上,这意味着编译器可以例如用一次写入替换对相同(非易失性)原子的连续写入(如果之间没有其他同步),对于读取也是如此.如果不使用读取的结果,它甚至可以完全消除读取(编译器可能仍然必须发出内存屏障).

在更理论的层面上,如果您的编译器可以证明您的所有程序都返回42,则允许将其转换为单个指令,而与程序在此过程中使用的线程数和原子数无关.如果您的程序使用不是这种情况的volatile变量.

编辑:例如This paper显示了允许编译器应用于原子循环变量的一些可能的(可能是意外的)优化.

转载注明原文:C 11原子:将它们与内存映射I / O一起使用是否有意义,甚至可能? - 代码日志