多线程中使用stl容器
2009-01-16 17:19
218 查看
在实际中,有时候要在多线程中使用一些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;
};
下面我实现了一个类自动完成这些操作,感觉比较方便,特贴出来共享
/****************************************************
* 线程安全的容器类
* 可以为所有的容器提供临界区支持
* 使其成为线程安全的
* 如 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;
};
相关文章推荐
- 多线程中使用迭代器 访问 STL 容器元素的越界问题
- STL的基本使用之关联容器:set和multiSet的基本使用
- Largest Number|leetcode,使用stl sort函数排序,排序后容器的内容被改变,尝试各种办法没有找出bug,奇葩!!!!
- 使用STL容器构成一棵树
- STL --最常见的容器使用要点
- 使用STL中的list容器实现单链表的操作
- 使用reverse_iterator迭代器实现STL容器的反向遍历
- 关于STL容器输出的更进一步简化,便于平时学习使用
- STL关联容器简单使用
- 多线程操作STL容器时不同同步方式的比较
- C++ STL入门教程(1)——vector(向量容器)的使用(附完整程序代码)
- C++ STL基本容器的使用
- 练习使用 STL sort 对容器进行排序
- STL容器使用DEMO-deque
- STL容器使用DEMO-queue
- STL容器使用DEMO-bitset
- STL容器 erase的使用陷阱 (一)
- STL:STL各种容器的使用时机详解
- C++STL容器使用经验总结
- STL各种容器的使用时机详解