封装一个简单的池操作

 

//临界区同步类
class CMRThreadLock
{
 //变量定义
private:
 CRITICAL_SECTION     m_csLock;     //临界变量

 //函数定义
public:
 //构造函数
 inline CMRThreadLock() { ::InitializeCriticalSection(&m_csLock); }
 //析构函数
 inline ~CMRThreadLock() { ::DeleteCriticalSection(&m_csLock); }

 //功能函数
public:
 //锁定函数
 virtual inline void Lock() { ::EnterCriticalSection(&m_csLock); }
 //解锁函数
 virtual inline void UnLock() { ::LeaveCriticalSection(&m_csLock); }
};

 

 

class CMRPoolObject
{
public:
 //must deep copy
 virtual CMRPoolObject* Copy()=NULL;
};

class CMRPool
{
public:
 CMRPool(DWORD initSize, DWORD maxSize, CMRPoolObject* po)
 {
  ASSERT(maxSize > initSize && initSize);

  m_MaxSize = maxSize;
  for (DWORD i = 0; i < initSize - 1; i++)
  {
   try
   {
    m_IdleObjects.push_back(po->Copy());
   }
   catch (...)
   {
    break;
   }  
  }
  m_IdleObjects.push_back(po);
 }
 
 virtual ~CMRPool()
 {
  m_Lock.Lock();
  for (list<CMRPoolObject*>::iterator it = m_IdleObjects.begin(); it != m_IdleObjects.end(); it++)
   delete *it;
  m_IdleObjects.clear();
  
  for (list<CMRPoolObject*>::iterator it = m_BusyObjects.begin(); it != m_BusyObjects.end(); it++)
   delete *it;
  m_BusyObjects.clear();
  m_Lock.UnLock();

 }

 CMRPoolObject* GetObject()
 {
  CMRPoolObject* result = NULL;
  m_Lock.Lock();

  if (m_IdleObjects.size())
  {
   result = m_IdleObjects.front();
   m_BusyObjects.push_back(result);
   m_IdleObjects.pop_front();
  }
  else if (ObjectCount() < m_MaxSize)
  {
   try
   {
    result = m_BusyObjects.back()->Copy();
    m_BusyObjects.push_back(result);
   }
   catch (...)
   {
    result = NULL;
   }   
  }

  m_Lock.UnLock();
  return result;
 }

 void ReleaseObject(CMRPoolObject* po)
 {
  m_Lock.Lock();
  for (list<CMRPoolObject*>::iterator it = m_BusyObjects.begin(); it != m_BusyObjects.end();)
  {
   if (*it == po)
   {
    m_BusyObjects.erase(it++);
    break;
   }
   else
    ++it;
  }
  m_IdleObjects.push_back(po);
  
  m_Lock.UnLock();
 }

 DWORD ObjectCount() { return m_BusyObjects.size() + m_IdleObjects.size(); }
 
 void Lock(){ m_Lock.Lock(); }
 void UnLock(){ m_Lock.UnLock(); }

 const list<CMRPoolObject*>& BusyObjects(){ return m_BusyObjects; }
 const list<CMRPoolObject*>& IdleObjects(){ return m_IdleObjects; }
private:
 list<CMRPoolObject*> m_BusyObjects;
 list<CMRPoolObject*> m_IdleObjects;
 DWORD m_MaxSize;
 CMRThreadLock m_Lock;
 
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值