|
@@ -50,6 +50,8 @@ public:
|
|
|
void push(T&& value);
|
|
|
bool push_noBlock(const 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;
|
|
|
}
|
|
|
|
|
|
+/* 入队,队列满就出队一个,非阻塞 */
|
|
|
+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 出队,删除队列的首个元素
|