Browse Source

V1.1.2
1、修改了环形队列

Apple 1 week ago
parent
commit
3f0fae7b94
2 changed files with 35 additions and 2 deletions
  1. 33 0
      module/RingQueue/RingQueue.hpp
  2. 2 2
      module/RingQueue/RingQueueManualMutex.hpp

+ 33 - 0
module/RingQueue/RingQueue.hpp

@@ -50,6 +50,8 @@ public:
     void push(T&& value);
     void push(T&& value);
     bool push_noBlock(const T& value);
     bool push_noBlock(const T& value);
     bool push_noBlock(T&& value);
     bool push_noBlock(T&& value);
+    /* 入队,队列满就出队一个,非阻塞 */
+    T push_pop(const T& value);
 
 
     /* 出队,删除队列的首个元素
     /* 出队,删除队列的首个元素
      * 注意,如果存储的是指针,需要手动释放该指针指向的内存区域,不然会造成内存泄漏 */
      * 注意,如果存储的是指针,需要手动释放该指针指向的内存区域,不然会造成内存泄漏 */
@@ -282,6 +284,37 @@ bool RingQueue<T>::push_noBlock(T&& value)
     return true;
     return true;
 }
 }
 
 
+/* 入队,队列满就出队一个,非阻塞 */
+template<typename T>
+T RingQueue<T>::push_pop(const T& value)
+{
+    T ret = _DefaultValue;
+    {
+        std::unique_lock<std::mutex> lock(m_mutex);
+        /* 如果队列已满,先出队一个元素 */
+        if(_isFull())
+        {
+            ret = std::move(m_queue[m_front]);
+            m_front = (m_front + 1) % m_capacity;
+            if(m_front == m_rear)
+            {
+                m_front = -1;
+                m_rear = -1;
+            }
+        }
+        /* 入队新元素 */
+        if(m_rear == -1)
+        {
+            m_front = 0;
+            m_rear = 0;
+        }
+        m_queue[m_rear] = value;
+        m_rear = (m_rear + 1) % m_capacity;
+    }
+    m_cond_NoEmpty.notify_all();
+    return ret;
+}
+
 
 
 /**
 /**
  * @brief 出队,删除队列的首个元素
  * @brief 出队,删除队列的首个元素

+ 2 - 2
module/RingQueue/RingQueueManualMutex.hpp

@@ -213,7 +213,7 @@ RingQueueManualMutex<T>::~RingQueueManualMutex()
 template<typename T>
 template<typename T>
 T&&  RingQueueManualMutex<T>::push(const T& value)
 T&&  RingQueueManualMutex<T>::push(const T& value)
 {
 {
-    T ret{};
+    T ret = _DefaultValue; // 默认值
     if(_isFull())
     if(_isFull())
     {
     {
         /* 队列已满,先出队一个元素 */
         /* 队列已满,先出队一个元素 */
@@ -233,7 +233,7 @@ T&&  RingQueueManualMutex<T>::push(const T& value)
 template<typename T>
 template<typename T>
 T&&  RingQueueManualMutex<T>::push(T&& value)
 T&&  RingQueueManualMutex<T>::push(T&& value)
 {
 {
-    T ret{};
+    T ret = _DefaultValue; // 默认值
     if(_isFull())
     if(_isFull())
     {
     {
         /* 队列已满,先出队一个元素 */
         /* 队列已满,先出队一个元素 */