有一种方法,以确保一个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}}块内。这是正确的吗?
答案 0 :(得分:3)
这还不够,因为.unique()
(和.use_count()
)忽略了链接到您的weak_ptr
的任何shared_ptr
,而这些.lock()
可以同时=COUNTA(SPLIT(REGEXREPLACE('Data Sheet'!G3:G313,"of",".$$."),"$$",false()));
被使无效您的假设。