![](/img/trans.png)
[英]What is diffrence between lock() and expired()? weak_ptr C++
[英]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.