为了避免消息队列频繁的申请和释放内存,采用循环队列作为消息队列。
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;
}
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/7467.html