一种不同的共享所有权
A different kind of shared ownership
C++中的shared_ptr
是为了解决一个问题,当多个对象获得一个对象的所有权时,会多次删除。它通过仅进行最后一次删除来实现此目的。
该指针还有另一种风格,当对象想要所有权但不想延迟删除时,它会采用一个弱指针,该指针会在删除时通知他以防止出现问题。
还有另一种方法可以做到这一点。不要只进行最后一次删除,而只进行第一次删除,并且应通知其余对象它就像弱指针一样发生。
这对于像连接这样的对象很有用,如果一端释放它,它应该被销毁,而另一端知道这一点。
C++或 Boost 中有这样的东西吗?
可以使用
单个共享的互斥shared_ptr
(仅用于创建和销毁对象)和用于访问的每个客户端/端点的weak_ptr
来建模此模式。
请注意,这样的方案会导致过度锁定,并且可能无法提供所需的语义。您需要在使用过程中lock
weak_ptr
,这会接触shared_ptr
内部互斥锁。当一端销毁主实例shared_ptr
实例时,对象将保留,同时任何读取操作完成。
更传统的解决方案是通过通道本身传输挂断消息。
有几种类型的通知:
- 同步
- 异步
- 按需(不是真正的通知)
根据你真正想要的东西,实现可能会有很大差异。
后者(按需)已经通过典型的shared_ptr
/weak_ptr
二分法可用:通过weak_ptr
访问对象时,您将知道它是否已同时被删除。
另外两个可以通过传统shared_ptr
之上的观察者模式实现,但是它们具有复杂性和性能后果,因此我会在使用它们之前确保需求是真实的。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- C++共享所有权与唯一所有权
- 如何通过更好的性能传递和共享共享的所有权
- 如何将所有权从一个共享指针向量转移到另一个向量?
- 一种不同的共享所有权
- C++:在共享所有权的情况下,C++11移动语义可以避免指针吗
- 使用 std::weak_ptr 共享资源所有权
- 智能指针,当c++ 11不支持时,它不会转移所有权,也不会被共享
- 共享所有权双重免费错误
- 如何增加std::共享指针的所有权计数