在msvs 2013中std :: shared_ptr的compare_exchange_weak是否损坏?

问题描述 投票:3回答:3

请看样本

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构建

c++ visual-c++ c++11 visual-studio-2013 atomic
3个回答
7
投票

您的程序表现出不确定的行为。

29.5 / 1有一个通用类模板atomic<T>。模板参数T的类型应该是可复制的(3.9)。

shared_ptr<int>不可复制。


4
投票

根据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中实现。


0
投票

问题是关于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

© www.soinside.com 2019 - 2024. All rights reserved.