您的位置:首页 > 编程语言 > C语言/C++

循环队列 作为消息队列

2016-06-12 20:21 302 查看
为了避免消息队列频繁的申请和释放内存,采用循环队列作为消息队列。

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 1024

class 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息