确定 std::shared_ptr 是否是对对象的唯一引用

determine if a std::shared_ptr is the unique reference to an object

本文关键字:对象 唯一 引用 ptr std shared 确定 是否是      更新时间:2023-10-16

有没有办法确保std::shared_ptr是整个程序中对对象的唯一引用?

我的印象是,即使在多线程环境中,以下内容也足够了,但是随着std::shared_ptr::unique被弃用,我不太确定(我的并发 fu 让我失望):

std::shared_ptr<Foo> bar(std::shared_ptr<Foo>&& src) {
     std::shared_ptr<Foo> self = std::move(src);
     if(self && self.unique()) {
        // self is *the* only reference
     }
     return std::move(self);
}

(编辑)

如果我理解正确(例如,请参阅为什么 std::shared_ptr::unique() 被弃用?)原子 ref 计数保证selfif 块内数据的唯一实时引用,但通过破坏引用进行的修改不会在调用 unique() 之前进行排序,并且可能尚未完成。

此后,在修改if块内的*self时仍然存在潜在的数据竞争。这是对的吗?

还不够,因为.unique()(和.use_count())忽略了链接到您的shared_ptr的任何weak_ptr,这些可以同时.lock(),从而使您的假设无效。