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

时间:2019-02-02 10:30:18

标签: c++ multithreading shared-ptr rvalue-reference

有一种方法,以确保一个std::shared_ptr唯一引用对象在整个程序?

我的印象是,即使在多线程环境中,以下条件也足够了,但是不赞成使用std::shared_ptr::unique(并不确定我的并发功能使我失败):

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);
}

(编辑)

如果我理解正确(请参见 eg Why is std::shared_ptr::unique() deprecated?),原子引用计数将保证self是对if内部数据的唯一实时引用阻止,但通过销毁引用进行的修改未在调用unique()之前先后进行,并且可能尚未完成。

此后,仍有修改时是一个潜在的数据竞争*self的{​​{1}}块内。这是正确的吗?

1 个答案:

答案 0 :(得分:3)

这还不够,因为.unique()(和.use_count())忽略了链接到您的weak_ptr的任何shared_ptr,而这些.lock()可以同时=COUNTA(SPLIT(REGEXREPLACE('Data Sheet'!G3:G313,"of",".$$."),"$$",false())); 被使无效您的假设。