繁体   English   中英

C ++避免在使用boost :: weak_ptr的成员函数中过多使用lock()

[英]C++ Avoiding excessive use of lock() in member functions that use boost::weak_ptr

我有一个名为Curve的抽象基类。 从中继承了三个类:
-单SingleCurve
-多MultiCurve
CurveShift ,可以“移动”从Curve派生的任何内容(在其构造函数中使用boost::shared_ptr<Curve>

我在内存中有一个跟踪所有曲线的存储库,我们称其为CurveStore 它被实现为具有std::map<std::string, boost::shared_ptr<Curve> >的单例。

我的问题是CurveShift 我想使用boost::weak_ptr来引用正在移动的基础Curve 这样,如果基础的Curve消失了, CurveShift将无法获得lock() ,我将知道CurveShift无效。 问题在于,在CurveShift实现中,每次访问成员函数之一时,您尝试获取lock()都会显着降低性能。 是否有标准的方式/“模式”来避免必须在所有成员函数中执行lock()

“模式”将是“外部/内部函数”(不是正式名称),其中外部函数(公共),锁定weak_ptr的锁和内部函数(私有)均使用shared_ptr&作为参数。 这仅在您具有实际可以使对象执行某些操作的精简接口时才有用(而不是getter / setter接口)。

我的问题是CurveShift 我想使用boost::weak_ptr来引用正在移动的基础Curve 这样,如果基础的Curve消失了, CurveShift将无法获得lock() ,我将知道CurveShift无效。

设计很奇怪而且很弱。 (但是大多数基于weak_something的设计都很奇怪而且很弱。)

您真的想要这种微弱的行为吗?

我建议您将设计更改为不包含空的CurveShift对象:每当销毁Curve ,都应删除所有依赖于它的对象。 这样,您不需要任何weak_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM