8

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

使用它:

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

代替:

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

2 回答 2

11

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

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

于 2013-08-18T21:09:02.440 回答
4

通常,这没有意义。

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

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

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

于 2013-08-18T21:04:31.750 回答