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

标签 c++ boost

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/

相关文章:

c++ - 为什么我可以将 ifstream 文件置于 if 条件中?

python - 使用默认参数将特定参数传递给 Boost Python 函数

boost - 强制Boost TypeIndex 报告特定的pretty_name

c++ - 生成随机长数

c++ - 将相同数据写入两个文件的有效方法

c++ - 如何使用 WaitForSingleObject()

c++ - 哪里应该使用ncurses刷新()?

c++ - 如何在 Windows 上安装 boost

c++ - 如何使用 C++ 计算召回率和精度?

c++ - 从并发析构函数停止 boost::asio::io_service::run()