消息队列模板类
来源:互联网 发布:淘宝店铺为什么搜不到 编辑:程序博客网 时间:2024/05/24 06:36
#include <vector>
#include <semaphore.h>
#include <pthread.h>
using namespace std;
template <class TData>
class TMessageQueue
{
public:
vector<TData> queue; //存储消息的队列
sem_t sem;
pthread_mutex_t mutex;
public:
TMessageQueue()
{
pthread_mutex_init(&mutex, NULL);
sem_init(&sem, 0, 0);
}
~TMessageQueue()
{
pthread_mutex_destroy(&mutex);
sem_destroy(&sem);
FreeQueue();
}
//将消息插入消息队列的尾部,正常情况下,放在队列尾部,从头部取
void *AddElement(TData pData);
/* 将记录放在队列的头部,
当外部请求取消、断开、异常退出时,
接入层将消息放入队列的头部,分发时,将还没有处理的相应消
息从队列中删除,将取消的消息放入业务线程的接收队列,业务
线程进行释放处理
*/
void AddElementAtFront(TData pData);
//从队列头部取一条记录
TData GetElement();
TData GetElement(int dd);
int count();
private:
//操作之前加锁处理
void Lock();
//操作之后解锁处理
void Unlock();
//设置事件,触发线程中的处理
void SetQueueEvent();
//
void WaitQueueEvent();
void FreeQueue();
};
void *TMessageQueue::AddElement(TData pData)
{
Lock();
queue.push_back(pData);
SetQueueEvent();
Unlock();
}
void TMessageQueue::AddElementAtFront(TData pData)
{
Lock();
queue.insert(queue.begin());
SetQueueEvent();
Unlock();
}
TData TMessageQueue::GetElement()
{
WaitQueueEvent();
TData p;
memset(&p,0, sizeof(TData));
Lock();
if (false == queue.empty())
{
p = queue.begin();
queue.erase(queue.begin());
}
Unlock();
return p;
}
TData TMessageQueue::GetElement(int dd)
{
if (dd == 1)
{
WaitQueueEvent();
}
TData p;
memset(&p, 0, sizeof(TData));
Lock();
if (false == queue.empty())
{
p = *queue.begin();
queue.erase(queue.begin());
}
Unlock();
return p;
}
int TMessageQueue::count()
{
return queue.size();
}
void TMessageQueue::Lock()
{
pthread_mutex_lock(&mutex);
}
void TMessageQueue::Unlock()
{
pthread_mutex_unlock(&mutex);
}
void TMessageQueue::WaitQueueEvent()
{
#ifdef LINUX
#undef _WITH_DBG
#ifndef _WITH_DBG
sem_wait(&sem);
#else
int oldvalue = 0;
int newvalue = 0;
do
{
sem_getvalue(&sem, &oldvalue);
}
while(oldvalue == 0);
while(1)
{
sem_trywait(&sem);
sem_getvalue(&sem, &newvalue);
if (newvalue < oldvalue) break;
}
}
void TMessageQueue::FreeQueue()
{
//queue.clear();
vector<TData> vtTemp;
vtTemp.swap(queue);
}
#include <semaphore.h>
#include <pthread.h>
using namespace std;
template <class TData>
class TMessageQueue
{
public:
vector<TData> queue; //存储消息的队列
sem_t sem;
pthread_mutex_t mutex;
public:
TMessageQueue()
{
pthread_mutex_init(&mutex, NULL);
sem_init(&sem, 0, 0);
}
~TMessageQueue()
{
pthread_mutex_destroy(&mutex);
sem_destroy(&sem);
FreeQueue();
}
//将消息插入消息队列的尾部,正常情况下,放在队列尾部,从头部取
void *AddElement(TData pData);
/* 将记录放在队列的头部,
当外部请求取消、断开、异常退出时,
接入层将消息放入队列的头部,分发时,将还没有处理的相应消
息从队列中删除,将取消的消息放入业务线程的接收队列,业务
线程进行释放处理
*/
void AddElementAtFront(TData pData);
//从队列头部取一条记录
TData GetElement();
TData GetElement(int dd);
int count();
private:
//操作之前加锁处理
void Lock();
//操作之后解锁处理
void Unlock();
//设置事件,触发线程中的处理
void SetQueueEvent();
//
void WaitQueueEvent();
void FreeQueue();
};
void *TMessageQueue::AddElement(TData pData)
{
Lock();
queue.push_back(pData);
SetQueueEvent();
Unlock();
}
void TMessageQueue::AddElementAtFront(TData pData)
{
Lock();
queue.insert(queue.begin());
SetQueueEvent();
Unlock();
}
TData TMessageQueue::GetElement()
{
WaitQueueEvent();
TData p;
memset(&p,0, sizeof(TData));
Lock();
if (false == queue.empty())
{
p = queue.begin();
queue.erase(queue.begin());
}
Unlock();
return p;
}
TData TMessageQueue::GetElement(int dd)
{
if (dd == 1)
{
WaitQueueEvent();
}
TData p;
memset(&p, 0, sizeof(TData));
Lock();
if (false == queue.empty())
{
p = *queue.begin();
queue.erase(queue.begin());
}
Unlock();
return p;
}
int TMessageQueue::count()
{
return queue.size();
}
void TMessageQueue::Lock()
{
pthread_mutex_lock(&mutex);
}
void TMessageQueue::Unlock()
{
pthread_mutex_unlock(&mutex);
}
void TMessageQueue::WaitQueueEvent()
{
#ifdef LINUX
#undef _WITH_DBG
#ifndef _WITH_DBG
sem_wait(&sem);
#else
int oldvalue = 0;
int newvalue = 0;
do
{
sem_getvalue(&sem, &oldvalue);
}
while(oldvalue == 0);
while(1)
{
sem_trywait(&sem);
sem_getvalue(&sem, &newvalue);
if (newvalue < oldvalue) break;
}
}
void TMessageQueue::FreeQueue()
{
//queue.clear();
vector<TData> vtTemp;
vtTemp.swap(queue);
}
0 0
- 消息队列模板类
- 队列类模板
- 队列类模板
- 类模板之队列
- 队列类模板
- 队列的类模板
- 模板队列Queue类
- c++模板队列类
- 消息队列类库代码
- CQueue封闭队列模板类
- 优先队列--模板类实现
- 队列类的模板实现
- 队列类模板的使用
- 【c++】环形队列类模板
- C++模板实现消息类
- 消息队列
- 消息队列
- 消息队列
- PHP特性
- 静态成员应用于时间类(改)
- RedHat Linux5.5下Oracle 11g安装图解
- 响应式图片处理——更改图片SRC路径
- ubuntu下安装firefox的flash插件
- 消息队列模板类
- Linux下通过crontab调度脚本时脚本所使用的环境变量问题
- 安装Ubuntu 13.04后要做的六件事
- PHP的应用及语法
- yum安装mysql
- 三角剖分浅析
- JS中window.open和window.opener的使用
- 开发基于 Google Maps Android API v2的 Android 应用
- Windows下用cmd命令安装及卸载服务