用限定符制作原子对象 - volatile 有什么意义吗?
使用它:
volatile std::atomic<int> i(1);
代替:
std::atomic<int> i(1);
不,也绝对没有意义std::atomic
,因为在内部std::atomic
,代码将处理变量可能随时更改的可能性,并且可能需要“告知”其他处理器它已更改(“告诉”其他处理器不包含在volatile
) 中。
您真正需要的唯一时间volatile
是如果您有一个指向您的代码正在控制的硬件的指针 - 例如读取计时器中的计数器,或者现在哪个帧缓冲区处于活动状态,或者告诉网卡在哪里读取下一个要发送的数据包的数据。这类东西是易变的,因为编译器无法知道这些东西的价值随时会改变。
通常,这没有意义。
用于atomic
允许在一个线程上修改变量,而其他线程可能在没有显式同步的情况下访问它。
用于volatile
控制对异常内存位置(例如硬件寄存器)的访问,其中每次读取和写入都必须按照程序指定的顺序进行。一个普通的变量,原子的或其他的,通常不需要这样的控制。
这两个概念彼此无关。特别是,不要volatile
与其他语言中用于使变量原子化的关键字混淆。在 C++ 中,volatile
与线程交互无关。