gpt4 book ai didi

C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:44 27 4
gpt4 key购买 nike

据我了解,C volatile 和用于内存栅栏的可选内联 asm 已用于在内存映射 I/O 之上实现设备驱动程序。在 Linux 内核中可以找到几个示例。

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

最佳答案

通常,您可以用原子替换内存栅栏,但不能用 volatile 替换内存栅栏,除非它与专门用于线程间通信的栅栏一起使用。

关于内存映射 I/O,原子性不够的原因是:

  • volatile 向您保证程序中对该变量的所有内存访问确实发生并且它们发生(在单个线程中)完全按照您指定的顺序进行。
  • std::atomic 仅保证您的程序的行为就好像所有这些内存访问都发生了(根据 C++ 的内存模型,它不知道内存映射I/O) 并且 - 根据指定的内存顺序 - 好像它们以指定的顺序发生。

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

在更理论的层面上,如果您的编译器可以证明您的程序所做的所有操作都返回 42,那么它就可以将其转换为一条指令,而不管您的程序在该过程中使用了多少线程和原子。如果您的程序使用 volatile 变量,则情况并非如此。

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

关于C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com