📄 syncontainer.h
字号:
//sunwangme@hotmail.com
#pragma once
#include "RWLock.h"
//提供同步的原子操作
//Red-Black Tree
// set
// map
//Hash-Set
//Hash-Map (hfip urlhash算法,pageHash算法使用MD5前4个字节就可以了)
//AVL-Tree
//BTree
//
//urlDone:find insert (set 和 map都不错,百万级别)
//urlTodo:find insert front (基于set的priority queue比较好,百万级别)
//urlDoing: find insert erase ((set 和 map都不错))
//urlError: find insert copy clear((set 和 map都不错))
//
template<class _ItemT,class _CT /*= stdext::hash_set<_ItemT>*/ >
class CSynContainer
{
public:
typedef CSynContainer<_ItemT,_CT> _MyT;
typedef typename _CT::iterator _MyCIt;
public:
//sunwang,2007.3.3,insert内部也要做一次find,insert失败就是查找成功所以这个没有必要做一个find
void insert(const _ItemT& item);
BOOL find(const _ItemT& item);
BOOL front(_ItemT& item); //urlNeedDo出队
void clear();
int size();
void erase(const _ItemT& item);
//由于readlock需要改变对象的内部成员变量的数字,所以不能带const,sunwang,2007.2.28
void copy(/*const*/ _MyT& items);
private:
_CT m_container;
CRWLock m_lock;
};
template<class _ItemT,class _CT>
void CSynContainer<_ItemT,_CT>::insert(const _ItemT& item)
{
m_lock.WriteLock();
m_container.insert(item);
m_lock.WriteUnlock();
return;
}
template<class _ItemT,class _CT>
BOOL CSynContainer<_ItemT,_CT>::front(_ItemT& item)
{
DWORD bResult = FALSE;
m_lock.WriteLock();
if(m_container.size())
{
_MyCIt pos = m_container.begin();
item = *pos;
m_container.erase(pos);
bResult=TRUE;
}
m_lock.WriteUnlock();
return bResult;
}
template<class _ItemT,class _CT>
BOOL CSynContainer<_ItemT,_CT>::find(const _ItemT& item)
{
BOOL bResult = FALSE;
m_lock.ReadLock();
if(m_container.find(item)!=m_container.end())
{
bResult=TRUE;
}
m_lock.ReadUnlock();
return bResult;
}
template<class _ItemT,class _CT>
void CSynContainer<_ItemT,_CT>::erase(const _ItemT& item)
{
m_lock.WriteLock();
m_container.erase(item);
m_lock.WriteUnlock();
return ;
}
template<class _ItemT,class _CT>
void CSynContainer<_ItemT,_CT>::clear()
{
m_lock.WriteLock();
m_container.clear();
m_lock.WriteUnlock();
return;
}
template<class _ItemT,class _CT>
int CSynContainer<_ItemT,_CT>::size()
{
int nSize=0;
m_lock.ReadLock();
nSize=(int)m_container.size();
m_lock.ReadUnlock();
return nSize;
}
template<class _ItemT,class _CT>
void CSynContainer<_ItemT,_CT>::copy(/*const*/ _MyT& items)
{
m_lock.WriteLock();
items.m_lock.ReadLock();
m_container=items.m_container;
items.m_lock.ReadUnlock();
m_lock.WriteUnlock();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -