循环队列 作为消息队列

来源:互联网 发布:ipowerl手指充电软件 编辑:程序博客网 时间:2024/04/28 19:39

为了避免消息队列频繁的申请和释放内存,采用循环队列作为消息队列。

queue.h:

#ifndef INC_QUEUE_H_#define INC_QUEUE_H_#include <pthread.h>#include <iostream>using namespace std;#define MAX_QUEUE_SIZE  500000#define SINGLE_DATA_SIZE 1024class Queue{public:    Queue(int maxSize = MAX_QUEUE_SIZE, int singleDataSize = SINGLE_DATA_SIZE);    ~Queue();public:    static Queue* getInstance();    string pop();    bool enqueue(const string& str);    bool dequeue(string& str);    bool isEmpty()const;    bool isFull()const;private:    int m_maxSize;    string* m_pBase;//内存的使用地址    int m_front; //第一个元素的. 出队列时要取的元素    int m_rear;//最后一个元素的下一个元素    static Queue* m_queue;};#endif /* INC_QUEUE_H_ */

queue.cpp

#include "queue.h"Queue* Queue::m_queue = NULL;Queue::Queue(int maxSize, int bufSize){    m_maxSize = maxSize;    m_pBase = new string[maxSize * bufSize];    //to do 申请失败    m_front = 0;    m_rear = 0;}Queue::~Queue(){    if(m_pBase)        delete []m_pBase;}Queue* Queue::getInstance(){    if(!Queue::m_queue)    {        m_queue = new Queue();        return m_queue;    }    return m_queue;}//循环队列保留一个不可用的节点bool Queue::isFull()const{    return m_front == (m_rear + 1)%m_maxSize;}bool Queue::isEmpty()const{    return m_front == m_rear;}string Queue::pop(){    return m_pBase[m_front];}bool Queue::enqueue(const string& str){    if(isFull())        return false;    m_pBase[m_rear] = const_cast<char*>(str.c_str());    m_rear = (m_rear + 1)%m_maxSize;    return true;}bool Queue::dequeue(string& str){    if(isEmpty())        return false;    str = m_pBase[m_front];    m_front = (m_front + 1)%m_maxSize;    return true;}


0 0
原创粉丝点击