一种不同的共享所有权

A different kind of shared ownership

本文关键字:共享 所有权 一种      更新时间:2023-10-16

C++中的shared_ptr是为了解决一个问题,当多个对象获得一个对象的所有权时,会多次删除。它通过仅进行最后一次删除来实现此目的。
该指针还有另一种风格,当对象想要所有权但不想延迟删除时,它会采用一个弱指针,该指针会在删除时通知他以防止出现问题。
还有另一种方法可以做到这一点。不要只进行最后一次删除,而只进行第一次删除,并且应通知其余对象它就像弱指针一样发生。
这对于像连接这样的对象很有用,如果一端释放它,它应该被销毁,而另一端知道这一点。
C++或 Boost 中有这样的东西吗?

可以使用

单个共享的互斥shared_ptr(仅用于创建和销毁对象)和用于访问的每个客户端/端点的weak_ptr来建模此模式。

请注意,这样的方案会导致过度锁定,并且可能无法提供所需的语义。您需要在使用过程中lock weak_ptr,这会接触shared_ptr内部互斥锁。当一端销毁主实例shared_ptr实例时,对象将保留,同时任何读取操作完成。

更传统的解决方案是通过通道本身传输挂断消息。

有几种类型的通知

  • 同步
  • 异步
  • 按需(不是真正的通知)

根据你真正想要的东西,实现可能会有很大差异。

后者(按需)已经通过典型的shared_ptr/weak_ptr二分法可用:通过weak_ptr访问对象时,您将知道它是否已同时被删除。

另外两个可以通过传统shared_ptr之上的观察者模式实现,但是它们具有复杂性和性能后果,因此我会在使用它们之前确保需求是真实的。