📄 intpointmap.cpp
字号:
/**********************************************************************
FileName : IntPointMap.cpp
Description : 整数-指针哈希映射类
Version : 1.0
Date : 2003年7月1日
Author : 刘荣辉
Other : 支持多线程的Map类,作为已发送队列(哈希表)
***********************************************************************/
#include "../include/IntPointMap.h"
//=====================构造函数===============================
CIntPointMap::CIntPointMap()
{
MaxSize = 331;
}
//======================析构函数==============================
CIntPointMap::~CIntPointMap()
{
sem_destroy(&WriteSem);
sem_destroy(&AddLock);
sem_destroy(&DelLock);
}
//======================初始化==============================
void CIntPointMap::Map_Init(int size)
{
MaxSize = size;
sem_init(&WriteSem, 0, size); //窗口大小初始化
sem_init(&AddLock, 0, 1);
sem_init(&DelLock, 0, 1);
}
//======================增加节点==============================
bool CIntPointMap::Add(unsigned int Sequence, char *pSUnit)
{
/*if(sem_trywait(&WriteSem)!=0) //窗口已满
{
return false;
}*/
sem_wait(&WriteSem); //等待占用一个空闲窗口
sem_wait(&AddLock); //防止多个线程同时插入队列单元
SentQ[Sequence] = pSUnit;
sem_post(&AddLock);
return true;
}
//======================获取最多MaxNum个节点============================
int CIntPointMap::GetAllNode(char *Node[], int MaxNum)
{
int iGot;
IntPointMap::iterator UnitPos;
sem_wait(&AddLock); //防止其他线程修改队列
sem_wait(&DelLock); //防止其他线程修改队列
iGot = 0;
for(UnitPos = SentQ.begin(); UnitPos != SentQ.end(); ++UnitPos)
{
Node[iGot] = UnitPos->second;
iGot++;
if(iGot==MaxNum)
break;
}
sem_post(&DelLock);
sem_post(&AddLock);
return iGot;
}
//======================查找节点==============================
char * CIntPointMap::Find(int Num)
{
IntPointMap::iterator UnitPos;
UnitPos = SentQ.find(Num);
if (UnitPos == SentQ.end()) //没找到
{
return NULL;
}
else
return UnitPos->second;
}
//======================删除节点==============================
int CIntPointMap::Delete(int Num)
{
int DelNum;
sem_wait(&DelLock);
DelNum = SentQ.erase(Num);
sem_post(&DelLock);
sem_post(&WriteSem);//释放一个窗口
return DelNum;
}
//======================查找获得并删除节点==============================
bool CIntPointMap::FindDel(unsigned int Sequence, char **pSUnit)
{
IntPointMap::iterator UnitPos;
UnitPos = SentQ.find(Sequence);
if (UnitPos == SentQ.end()) //没找到
{
*pSUnit = NULL;
return false;
}
*pSUnit = UnitPos->second;
sem_wait(&DelLock);
SentQ.erase(UnitPos);
sem_post(&DelLock);
sem_post(&WriteSem);//释放一个窗口
return true;
}
//======================测试窗口是否满==============================
bool CIntPointMap::IsFull()
{
if((int)SentQ.size()==MaxSize) return true;
else return false;
}
//=============================================
int CIntPointMap::GetSize() //获取队列当前大小
{
return SentQ.size();
}
int CIntPointMap::GetMaxSize() //获取队列最大容量
{
return MaxSize;
}
//===================Map_Pos的位置初始化==========================
int CIntPointMap::PosInit(Map_Pos *UnitPos)
{
*UnitPos = SentQ.begin();
return 0;
}
//================获取某位置的节点并指向下一个(首尾循环)==================
int CIntPointMap::GetNext(char **Node, Map_Pos *UnitPos)
{
*Node = (*UnitPos)->second;
if(*UnitPos == SentQ.end())
{
*UnitPos = SentQ.begin();
return -1; //返回-1表示已取出最后一个,下次将从头开始取
}
else
(*UnitPos)++;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -