使用限定符 - volative 使 std::atomic<> 对象有意义吗?

Is there any sense to make std::atomic<> objects with the qualifier - volatile?

本文关键字:gt 对象 有意义 lt volative std atomic      更新时间:2023-10-16

使用限定符-volatil生成原子对象有意义吗?

使用:

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

而不是:

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

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

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

通常,这是没有意义的。

使用atomic允许在一个线程上修改变量,而其他线程可能正在访问该变量,而无需显式同步。

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

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