【问题标题】:Is there any sense to make std::atomic<> objects with the qualifier - volatile?用限定符制作 std::atomic<> 对象 - volatile 有什么意义吗?
【发布时间】:2013-08-18 20:36:08
【问题描述】:

用限定符 - volatile 制作原子对象有什么意义吗?

使用它:

volatile std::atomic<int> i(1);

代替:

std::atomic<int> i(1);

【问题讨论】:

标签: c++ c++11 atomic


【解决方案1】:

不,让std::atomic 也为 volatile 绝对没有意义,因为在 std::atomic 内部,代码将处理变量可能随时更改的可能性,并且其他处理器可能需要“告诉”它已经改变了(volatile 不包括“告诉”其他处理器)。

您真正需要volatile 的唯一情况是,如果您有一个指向您的代码正在控制的硬件的指针 - 例如读取计时器中的计数器,或者当前哪个帧缓冲区处于活动状态,或者告诉网卡在哪里读取数据以供下一个数据包发送。这类东西是易变的,因为编译器无法知道这些东西的价值随时会改变。

【讨论】:

  • +1 不错的答案。介意问为什么有std::atomic&lt;T&gt;volatile 成员函数吗?如果不需要volatile 原子,为什么首先定义那些volatile 函数?
【解决方案2】:

通常没有意义。

使用atomic 允许在一个线程上修改变量,而其他线程可能在没有显式同步的情况下访问它。

使用volatile 控制对异常内存位置(例如硬件寄存器)的访问,其中每次读取和写入都必须按照程序指定的顺序进行。一个普通的变量,无论是原子的还是其他的,通常不需要这样的控制。

这两个概念彼此无关。特别是,不要将volatile 与其他语言中用于使变量原子化的关键字混淆。在 C++ 中,volatile 与线程交互无关。

【讨论】:

  • 你的第一句话很有趣:当声明一个原子对象volatile有意义吗?看来,唯一合理的使用可能是异常成员中的自动对象......
  • @DietmarKühl:可以想象这样一种情况,即希望多线程访问硬件寄存器或其他任何东西,这两个概念都可能有意义。不寻常,但并非超出可能性范围。
  • 这就是我的想法,但我怀疑它是否需要工作!毕竟,任何std::atomic&lt;T&gt; 都可以使用互斥锁和T 来实现,即std::atomic&lt;T&gt; 的内存布局是未知的,但至少对于某些类型是已知的。
  • @DietmarKühl:是的,你可能是对的;我猜你会想要atomic&lt;volatile int&gt;。我写“通常”是因为我无法证明它永远没有意义,而不是因为我认为它可能。
  • std::atomic&lt;T&gt; 值是否可以位于特定位置 - 换句话说,我们可以做类似std::atomic&lt;volatile int&gt;* pAtomic = reinterpret_cast&lt;std::atomic&lt;volatile int&gt;*(0xfce00000); 的事情[假设我们知道 0xfce00000 是硬件领域的一些好的内存地址?只是好奇,而不是抱怨答案。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 2015-05-24
  • 2011-03-03
  • 2021-06-21
  • 2012-10-19
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
相关资源
最近更新 更多