循环队列 作为消息队列详解程序员

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

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/7467.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论