实现“带寿命的Singletons”

这篇博客探讨了如何通过生命周期追踪器来实现具有寿命的Singletons,详细介绍了如何创建、删除和管理这些Singleton对象,特别是在多线程环境中确保其正确实例化和销毁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸡生蛋、蛋生鸡问题不必纠结,只需要仔细操控PTrackerArray,看代码

namespace  Private{

class LifetimeTracker{

public:

LifetimeTracker(unsigned int x):longervity__(x){}

vitual ~LifetimeTracker()=0;

friend inline  bool Compare(

unsigned int longevity,const LifetimeTraker *p)

{

return p ->longevity_<longevity;

}

private:

unsigned int longevity_;

}

inline LifetimeTracker::~LifetimeTracker(){}

}

namespace Private{

typedef  LifetimeTracker ** TrackerArray;

extern TrackerArray pTrackerArray;

extern unsigned int elements;

}

template <typename T>void Delete(T *pObj)

{
delete pObj;

}

namespace 

{

template <typename T,typename Destroyer>

class ConcreteLifetimeTracker: public LifetimeTracker

{

public:

ConcreateLifetimeTracker(T* pDynObject,unsigned int longevity,Destroyer destroyer):

LifetimeTracker(longevity),pTracked_(pDynObject),

destroyer_(destroyer)

{}

~ConcreteLifetimeTracker()

{

destroyer_(pTracked_);

}

private:

T *pTracked_;

Destroyer destoryer_;

};

void AtExitFn();

}

template <typename T,typename Destoryer>

void SetLogevity(T *pDynObject ,unsigned int longevity,Destroyer d = Private::Deleter<T>::Delete)

{

TrackerArray pNewArray = static_cast<TrackerArray>(std::realloc(pTrackerArray,sizeof(T)*(elements+1)));

if(!pNewArray)throw std::bad_alloc();

pTrackerArray= pNewArray;

LifetimeTracker *p=new ConcreateLifetimeTracker<T,Destroyer>(pDynObject,longevity,d);

TrackerArray pos = std::upper_bound(pTrackerArray,pTrackerArray+elements,longevity,Compare);

std::copy_backward(pos,pTrackerArray+elements,pTrackerArray+elements+1);

*pos =p;

++elements;

std::atexit(AtExitFn);

}

static void AtExitFn()

{

assert(elements>0&&pTrackerArray !=0);

LifetimeTracker * pTop= pTrackerArray[elemets -1];

pTrackerArray= static_cast<TrackerArray>(std::realloc)(pTrackerArray,sizeof(T)*--elements));

delete pTop;

}

class Log

{

public :

static void Create()

{

pInstance_=new Log;

SetLongevity(*this,longevity_);

}

private:

static const unsigned int longevity_=2;

static Log*pInstance_;

}

多线程处理Singleton

Single& Singleton::Instance()

{

if(!pInstance_)

{

Lock guard(mutex_);

pInstance_=new Singleton;

}

return *pInstance_;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值