⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syncontainer.h

📁 概述:数据的纵向收集
💻 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 + -