#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);
}