首页 > 解决方案 > 如果不需要 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++ 标准要为其提供重载函数呢?

标签: c++c++11standardsatomicvolatile

解决方案


如果 volatile 对于 std::atomic 完全不需要,

因为有问题的陈述与提供答案的问题有关。

就 C++ 内存模型中访问的原子性和可见性而言(这就是问题所在),这atomic就是您所需要的。但是, 的用例volatile主要是关于与外部系统的通信。诸如内存映射设备之类的东西可以在 C++ 内存模型的范围之外进行更新。

这些功能不重叠。也就是说,volatile并不意味着 C++ 原子性/可见性,并且 C++ 原子性/可见性并不意味着从内存模型外部更新值。但是,想象一下您可能需要 C++ 原子性/可见性以及外部更新的情况并非不合理。

也许该atomic对象存在于某个共享进程内存中。C++ 内存模型不知道发生在程序之外的事情,因此atomic单独使用不会做任何事情来确保程序外部操作的可见性。但是volatile可以。

volatile不需要在 C++ 内存模型中完成它的工作atomic但对于特定用户,他们可能同时需要atomicvolatile。因此超载。


推荐阅读