消息队列模板类

来源:互联网 发布:淘宝店铺为什么搜不到 编辑:程序博客网 时间: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);

}

0 0
原创粉丝点击