gpt4 book ai didi

c++ - 为什么将引用计数器值读取为对 volatile 常量的引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:55 25 4
gpt4 key购买 nike

smart_ptr\detail\atomic_count_win32.hpp 下的 Boost 1.5.1 源代码中,有一个简洁的小原子引用计数器 boost::detail::atomic_count

在第 48 行,他们做了一个我很好奇的类型转换:

class atomic_count
{
public:

// ...

operator long() const
{
return static_cast<long const volatile &>( value_ );
}

private:
long value_;

为什么将计数器值强制转换为 a-reference-to-a-volatile-constant-long (long const volatile&)?

最佳答案

MSVC 提供了一个现已弃用的 extension on volatile variables ,为它们提供获取和释放语义(关于多线程编程的内存排序保证。)

此转换在变量上“启用”此扩展,赋予它读取-获取语义(以匹配任何可能发生的发布-写入)。同样,这是非标准。在 C++11 代码中你应该使用 std::atomic<> .

他们需要这个因为 boost::shared_ptr保证 shared_ptr<T> 的正确性在多线程(共享)中使用;这是他们对 lock-free 的实现柜台。

(另外,这只是故事的一半:虽然这个扩展可以提供所需的顺序和可见性保证,但它不保证原子性。在 Win32 上,这由它运行的平台隐式保证:对齐的字大小整数读取每个平台的写入都是原子的。)

防患于未然:没有这个扩展 volatile对多线程编程没有用。甚至不要尝试。此扩展已弃用,因此您应该尽可能避免使用它。

关于c++ - 为什么将引用计数器值读取为对 volatile 常量的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690600/

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