确定 std::shared_ptr 是否是对对象的唯一引用
determine if a std::shared_ptr is the unique reference to an object
有没有办法确保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 计数保证self
是 if
块内数据的唯一实时引用,但通过破坏引用进行的修改不会在调用 unique()
之前进行排序,并且可能尚未完成。
此后,在修改if
块内的*self
时仍然存在潜在的数据竞争。这是对的吗?
这
还不够,因为.unique()
(和.use_count()
)忽略了链接到您的shared_ptr
的任何weak_ptr
,这些可以同时.lock()
,从而使您的假设无效。
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 使用Unique_ptr确保工厂中的对象唯一
- 具有引用成员的结构是否具有唯一的对象表示形式
- 堆分配的对象是否存在永不为空的唯一所有者?
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 添加要映射的对象的唯一指针
- 唯一命名对象的表
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- 唯一 ptr 将所有权移动到包含对象的方法
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- 当原始指针和唯一指针都引用同一对象时,如何避免双重释放
- 将对象数组转换为指向唯一对象的指针数组
- 我如何模拟将作为唯一_ptr存储在gmock中的对象
- 使用具有唯一随机数的结构数组创建多个对象
- 确定 std::shared_ptr 是否是对对象的唯一引用
- 如何在 C++ 中插入和排序具有唯一条目的对象向量
- 唯一的指针在移动后仍然容纳对象
- 将全局对象初始化为指针是唯一成功的方法
- 具有编译器强制对象唯一所有权语义的c++类