c++ - 如果不需要 volatile,为什么 std::atomic 方法会提供 volatile 重载?
问题描述
这个很好的答案说:
volatile
与 .一起使用时完全没有必要std::atomic
。
但是,std::atomic_fecth_sub
提供了一个重载函数:
template<class T>
T atomic_fetch_sub(volatile std::atomic<T>* obj,
typename std::atomic<T>::difference_type arg ) noexcept;
我的问题是:
如果volatile
对于 完全没有必要std::atomic
,为什么 C++ 标准要为其提供重载函数呢?
解决方案
如果 volatile 对于 std::atomic 完全不需要,
因为有问题的陈述与提供答案的问题有关。
就 C++ 内存模型中访问的原子性和可见性而言(这就是问题所在),这atomic
就是您所需要的。但是, 的用例volatile
主要是关于与外部系统的通信。诸如内存映射设备之类的东西可以在 C++ 内存模型的范围之外进行更新。
这些功能不重叠。也就是说,volatile
并不意味着 C++ 原子性/可见性,并且 C++ 原子性/可见性并不意味着从内存模型外部更新值。但是,想象一下您可能需要 C++ 原子性/可见性以及外部更新的情况并非不合理。
也许该atomic
对象存在于某个共享进程内存中。C++ 内存模型不知道发生在程序之外的事情,因此atomic
单独使用不会做任何事情来确保程序外部操作的可见性。但是volatile
可以。
volatile
不需要在 C++ 内存模型中完成它的工作。atomic
但对于特定用户,他们可能同时需要atomic
和volatile
。因此超载。
推荐阅读
- spring - 如何组装反应功能模块?
- c++ - OpenGL:使用鼠标移动 2D 正交相机
- r - 无法过滤带有串扰的传单多边形
- flutter - 我对我不太理解的位置参数有错误。请帮忙
- xamarin - Telerik RadChart 有 2 个图表时不显示
- javascript - 在 sessionStorage 中保存 userId 给出错误?
- javascript - 如何使用 Ant Design Vue 禁用 Select 中的特定元素?
- sql - 如何将时间戳从sas转换为普通时间戳
- pandas - 将多种类型的值转换为整数值
- r - 如何获取包含多个不同 URL 的字符串列表并将它们转换为 R 上的可点击链接?