shared_ptr以及weak_ptr实现的弱回调以及对象池管理
直接上代码一条一条的解释
class StockFactory:public boost::enable_shared_from_this<StockFactory>,boost::noncopyable
{
public:
shared_ptr<Stock> get(const string& key)
{
shared_ptr<Stock> pStock;//从工厂中产生的相应股票的shared_ptr,如果这只股票不存在先创建。
MutexLockGuard lock(mutex_);
weak_ptr<Stock> wkStock=stocks_[key];如果key不存在直接就穿件一个wak_ptr.
pStock=wkStock.lock();
if(!pStock)
{
pStock.reset(new Stock(key),boost::bind(&Stock::weakDeteleCallBack,boost::weak_ptr(shared_from_this),_1));//这一句话非常重要,这里实 //现了弱回调,把factory的weak_ptr传入到相应的Stock_类,避免延长了factory的生命期,同时在stock类析构的时候可以判断相应的Factory是否 //还活着
wkStock=pStock;
}
return pStock;
}
private:
static void weakDeleteCallback(const boost::weak_ptr<StockFactory>& wkFactory,Stock* stock)
{
shared_ptr<StockFactory> factory(wkFactory.lock());//尝试提升,看是否还存在Factory
if(factory)
{
fatory->removestock(stock);
}
delete stock;
}
private:
mutable MutexLock mutex_;
map<string,weak_ptr<Stock> > stocks_;//一个对象池,使用weak_ptr以避免延长股票类stock的生命期,根据股票号key与相应的对象进行关联。
}