使用限定符 - volative 使 std::atomic<> 对象有意义吗?
Is there any sense to make std::atomic<> objects with the qualifier - volatile?
使用限定符-volatil生成原子对象有意义吗?
使用:
volatile std::atomic<int> i(1);
而不是:
std::atomic<int> i(1);
不,使std::atomic
也具有易失性是绝对没有意义的,因为在std::atomic
内部,代码将处理变量可能随时更改的可能性,并且可能需要"告知"其他处理器它已经更改("告知"的其他处理器不包括在volatile
中)。
你真正需要volatile
的唯一时间是,如果你有一个指向代码控制的硬件的指针,例如读取计时器中的计数器,或者哪个帧缓冲区现在处于活动状态,或者告诉网卡在哪里读取下一个要发送的数据包的数据。这类东西是不稳定的,因为编译器不知道这些东西的值可以随时更改。
通常,这是没有意义的。
使用atomic
允许在一个线程上修改变量,而其他线程可能正在访问该变量,而无需显式同步。
使用volatile
控制对异常内存位置(如硬件寄存器)的访问,在这些位置,每次读取和写入都必须按照程序指定的顺序进行。一个普通变量,无论是原子变量还是其他变量,通常都不需要这样的控制。
这两个概念互不相关。特别是,不要将volatile
与其他语言中用于使变量成为原子的关键字混淆。在C++中,volatile
与线程交互无关。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象