相关疑难解决方法(0)

为什么不赞成使用std :: shared_ptr :: unique()?

这是什么技术问题std::shared_ptr::unique()是它在C++ 17中被弃用的原因?

根据cppreference.com,std::shared_ptr::unique()在C++ 17中被弃用

从C++ 17开始不推荐使用此函数,因为use_count它只是多线程环境中的近似值.

我理解这是真的use_count() > 1:虽然我拿着它的引用,但其他人可能会同时放弃他或创建一个新副本.

但是如果use_count()返回1(这是我在调用时感兴趣的话unique())那么就没有其他线程可以以一种活泼的方式改变这个值,所以我希望这应该是安全的:

if (myPtr && myPtr.unique()) {
    //Modify *myPtr
}
Run Code Online (Sandbox Code Playgroud)

我自己的搜索结果:

我发现这个文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0521r0.html建议弃用以回应C++ 17 CD评论CA 14,但我找不到评论本身.

作为替代方案,该文件建议增加一些说明,包括以下内容:

注意:当多个线程可以影响返回值时use_count(),结果应视为近似值.特别是,use_count() == 1并不意味着通过先前破坏的访问shared_ptr在任何意义上都已完成. - 结束说明

我理解这可能use_count()是当前指定方式的情况(由于缺乏保证的同步),但为什么分辨率不仅仅是指定这样的同步并因此使上述模式安全?如果有一个基本的限制,不允许这种同步(或使其成本高昂),那么如何才能正确实现析构函数?

更新:

我忽略了@ alexeykuzmin0和@rubenvb提出的明显案例,因为到目前为止我只unique()shared_ptr其他线程本身无法访问的实例上使用过.因此,没有任何危险,特定的实例将以一种活泼的方式被复制.

我仍然有兴趣了解CA 14究竟是什么,因为我相信unique()只要保证与shared_ptr其他线程上的不同实例发生的任何事情同步,我的所有用例都会起作用.所以它对我来说似乎仍然是一个有用的工具,但我可能会忽略一些基本的东西.

为了说明我的想法,请考虑以下事项:

class MemoryCache {
public:
    MemoryCache(size_t size)
        : …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading shared-ptr c++17

31
推荐指数
2
解决办法
3466
查看次数

标签 统计

c++ ×1

c++17 ×1

multithreading ×1

shared-ptr ×1