在 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/