请看样本
std::atomic < std::shared_ptr < int > > a;
std::shared_ptr < int > b;
std::shared_ptr < int > c = std::make_shared < int > (10);
while(a.compare_exchange_weak(b, c));
assert(a.load() == c);
assert(a.load().use_count() == 2); // <- assertion is failed.
您怎么看?是编译器错误吗?
在Win32模式下使用msvs 2013构建
您的程序表现出不确定的行为。
29.5 / 1有一个通用类模板
atomic<T>
。模板参数T
的类型应该是可复制的(3.9)。
shared_ptr<int>
不可复制。
根据Igor的回答,std::atomic<std::shared_ptr<T>>
没有定义的行为。您需要使用C ++ 11§20.7.2.5the non-member shared_ptr
atomic function overloads原子访问[util.smartptr.shared.atomic]中详细介绍的shared_ptr
。
shared_ptr
对于我来说,标准没有强制要求使用这些功能来实现std::shared_ptr < int > a;
std::shared_ptr < int > b;
std::shared_ptr < int > c = std::make_shared < int > (10);
while(std::atomic_compare_exchange_weak(&a, &b, c))
;
assert(std::atomic_load(&a) == c);
assert(std::atomic_load(&a).use_count() == 2);
的部分专业化。
我看不到template <typename T> struct std::atomic<shared_ptr<T>>
中的非成员原子重载,因此它们可能不会在VS2013中实现。
问题是关于C ++ 11的,但值得指出的是,因为C ++ 20 OP代码是有效的,因为Microsoft's documentation of the <memory>
header和<memory>
都有std::atomic
的特殊化。] >
参见:shared_ptr
另外,使用unique_ptr
的替代方法是std::atomic<std::shared_ptr<T>>
at cppreference。