gpt4 book ai didi

c++ - 如果 volatile 是不必要的,为什么 std::atomic 方法提供 volatile 重载?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:05 26 4
gpt4 key购买 nike

this good answer说:

volatile is completely unnecessary when used with 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++ 标准要为它提供一个重载函数?

最佳答案

If volatile is completely unnecessary for std::atomic,

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

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

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

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

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

关于c++ - 如果 volatile 是不必要的,为什么 std::atomic 方法提供 volatile 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57602697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com