是否有任何意义使std :: atomic<>具有限定符的对象 - volatile?

时间:2013-08-18 20:36:09

标签: c++ c++11 atomic

使用限定符生成原子对象是否有意义 - volatile?

使用:

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

而不是:

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

2 个答案:

答案 0 :(得分:9)

不,让std::atomic也变得不稳定毫无意义,因为在std::atomic内部,代码将处理变量随时可能发生变化的可能性,以及其他处理器可能需要被“告知”它已经改变了(“告诉”其他处理器不在volatile覆盖)。

您真正需要volatile的唯一时间是,如果您有一个指向您的代码所控制的硬件的指针 - 例如,在计时器中读取计数器,或者现在哪个帧缓冲区处于活动状态,或者告诉网卡在哪里读取下一个要发送的数据包的数据。那些东西是不稳定的,因为编译器无法知道这些东西的价值随时都会发生变化。

答案 1 :(得分:4)

通常,它没有意义。

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

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

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