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

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

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

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

相关推荐

发表回复

登录后才能评论

WordPress 数据库错误: [Duplicate entry '81-7bc5f87d83893fa5db53603967a72d35' for key 'task_id_source_url_key']
insert into wp_autoblog_queue(task_id,source_url,source_url_key,create_date_time,not_check_stoped,post_interval) values(81,'http://www.52im.net/forum.php?mod=collection&action=view&ctid=16&page=3','7bc5f87d83893fa5db53603967a72d35',1734654689,0,0)