多线程中使用stl容器

来源:互联网 发布:mysql该不该用join 编辑:程序博客网 时间:2024/05/16 16:12

在实际中,有时候要在多线程中使用一些stl容器,为了保证安全,需要不断的加锁,解锁

下面我实现了一个类自动完成这些操作,感觉比较方便,特贴出来共享

 

/****************************************************
 * 线程安全的容器类
 * 可以为所有的容器提供临界区支持
 * 使其成为线程安全的
 * 如 CSafeContainer<std::list<int> >  p;
 * 那么调用 p->push_back 就是线程安全的
 * 如果CSafeContainer<std::list<int> >  *p;
 * (*p)->push_back 按照这种方式调用
 ****************************************************/
 template<typename T>
 class CSafeContainer
 {
 public:
  class CProxy
  {
  public:
   CProxy(T* pObj,CCriticalSection* pCritical)
   {
    m_pObj = pObj;
    m_pCritical = pCritical;
    m_pCritical->Lock();
   }
   ~CProxy()
   {
    if(m_pCritical)
    {
     m_pCritical->Unlock();
    }
   }
   //返回真正的对象
   T* operator ->()
   {
    return m_pObj;
   }
  private:
   CCriticalSection* m_pCritical;
   T* m_pObj;
  };
  CSafeContainer(){}
  CSafeContainer(T obj)
  {
   m_Obj = obj;
  }
  CProxy operator ->()
  {
   //返回临时对象
   return CProxy(&m_Obj,&m_Critical);
  }
  /*如果不需要进行同步则先使用改方法取出对象指针*/
  T* Get()
  {
   return &m_Obj;
  }
 private:
  CCriticalSection m_Critical;
  T m_Obj;
 };

原创粉丝点击