moodycamel::ConcurrentQueue 清空队列的方法论

方法1:循环弹出元素

cpp 复制代码
#include <concurrentqueue.h>

// 如果存储的是指针类型
moodycamel::ConcurrentQueue<int*> queue;
int* item = nullptr;
while (queue.try_dequeue(item)) {
    if (item) {
        delete item;  // 如果需要释放内存
        item = nullptr;
    }
}

// 如果存储的是普通类型
moodycamel::ConcurrentQueue<int> queue;
int item;
while (queue.try_dequeue(item)) {
    // 元素自动销毁
}

方法2:批量弹出

cpp 复制代码
#include <concurrentqueue.h>
#include <vector>

moodycamel::ConcurrentQueue<int> queue;

// 批量弹出,效率更高
std::vector<int> temp;
queue.try_dequeue_bulk(std::back_inserter(temp), 
                      queue.size_approx());

// temp现在包含所有弹出的元素,随后会被自动销毁
temp.clear();  // 立即释放内存

方法3:使用交换技巧、或 std::move(...)

cpp 复制代码
// 最简单的方法:创建新队列替换旧队列
moodycamel::ConcurrentQueue<int> newQueue;
std::swap(queue, newQueue);
// 原队列的所有权转移到了newQueue,出作用域时自动销毁

方法4:自定义清空函数(模板)

cpp 复制代码
template<typename T>
void ClearConcurrentQueue(moodycamel::ConcurrentQueue<T>& queue) {
    T item;
    while (queue.try_dequeue(item)) {
        // 元素自动处理
    }
}

// 对于指针类型的特化版本
template<typename T>
void ClearConcurrentQueue(moodycamel::ConcurrentQueue<T*>& queue) {
    T* item = nullptr;
    while (queue.try_dequeue(item)) {
        delete item;
        item = nullptr;
    }
}

线程安全

并发队列,在清空过程中可能有其他线程继续插入元素。如果需要完全清空:

  1. 暂停生产者:确保没有线程在插入
  2. 使用原子标志:协调清空操作
  3. 多次清空:循环清空直到确认队列为空
cpp 复制代码
// 确保队列完全清空的稳健方法
void EnsureQueueEmpty(moodycamel::ConcurrentQueue<int>& queue) {
    int item;
    int emptyCount = 0;
    const int MAX_EMPTY_CHECKS = 3;
    
    while (emptyCount < MAX_EMPTY_CHECKS) {
        if (queue.try_dequeue(item)) {
            emptyCount = 0;  // 重置计数器
        } else {
            emptyCount++;
            std::this_thread::yield();  // 让出CPU
        }
    }
}
相关推荐
无限进步_16 小时前
C++11概览与统一初始化
开发语言·c++
笨蛋不要掉眼泪16 小时前
Java并发编程:内存可见性与synchronized同步机制
java·开发语言·并发
爱喝水的鱼丶17 小时前
SAP-ABAP:数据类型与数据对象(8篇) 第四篇:关系映射篇——从类型定义到对象实例的转化逻辑
开发语言·数据库·学习·sap·abap
吃着火锅x唱着歌17 小时前
深度探索C++对象模型 学习笔记 第五章 构造、解构、拷贝语意学(1)
c++·笔记·学习
水无痕simon17 小时前
1. Guava 介绍
开发语言·python·guava
AI科技星17 小时前
全域数学公理:基于32维超复数与易经卦爻的宇宙大一统理论(整理版)
c语言·开发语言·线性代数·量子计算·agi
之歆17 小时前
DAY_13JavaScript DOM 操作完全指南:实战案例、性能优化与业务价值(下)
开发语言·前端·javascript·性能优化·ecmascript
承渊政道17 小时前
【贪心算法】(经典实战应用解析(五):单调递增的数字、坏了的计算器、合并区间、⽆重叠区间、⽤最少数量的箭引爆⽓球)
数据结构·c++·leetcode·贪心算法·排序算法·动态规划·哈希算法
Brilliantwxx17 小时前
【C++】深度剖析 · 继承 (虚基表+虚函数表)
开发语言·c++
砍材农夫17 小时前
物联网 基于netty构建mqtt协议规范(发布/订阅模式)
java·开发语言·物联网·netty