快速搞定多线程数据共享:moodycamel::ConcurrentQueue 无锁并发队列完整指南
2026/9/13 11:44:13 网站建设 项目流程

快速搞定多线程数据共享:moodycamel::ConcurrentQueue 无锁并发队列完整指南

【免费下载链接】concurrentqueueA fast multi-producer, multi-consumer lock-free concurrent queue for C++11项目地址: https://gitcode.com/GitHub_Trending/co/concurrentqueue

C++ 里多个线程共享一份数据,线程安全队列是常见解法。moodycamel::ConcurrentQueue 是一个 C++11 无锁并发队列:单头文件、零依赖,多生产者多消费者可并行收发数据,另有阻塞版可用。

判断值不值得用

  • 适合:多线程共享任务队列(生产者-消费者模式)的场景,编译器支持 C++11 即可
  • 解决:加锁队列在高并发下的性能瓶颈,以及 Boost/TBB 等同类实现对方言类型的限制
  • 不建议:线程间本来不共享数据时(不共享才最快);依赖严格线性化或全局出队顺序的场景,官方 README 明确它两者都不提供

跑通最小示例 🚀

全部实现集中在单个头文件 concurrentqueue.h,拷进项目就能编译,没有任何构建配置。阻塞版在 blockingconcurrentqueue.h,额外依赖 lightweightsemaphore.h。编译器要求 VS2012+ 或 g++ 4.8+。

#include <thread> #include "concurrentqueue.h" moodycamel::ConcurrentQueue<int> q; // 无锁队列,多线程直接使用 std::thread producer([&] { for (int i = 0; i < 100; ++i) q.enqueue(i); // 入队 }); std::thread consumer([&] { int item; for (int i = 0; i < 100; ++i) while (!q.try_dequeue(item)) {} // 队列空则立即重试 }); producer.join(); consumer.join();

看懂三大特性

  • 纯无锁设计:无锁指靠原子操作(一次做完、不会半截的 CPU 指令)协调,不抢锁、不阻塞,任意数量线程同时使用
  • 批量收发enqueue_bulk/try_dequeue_bulk一次搬多个元素,单元素开销远低于逐个操作
  • 灵活扩展:每线程持有生产者/消费者 token 可加速操作;阻塞变体提供wait_dequeue及超时版,消费者不必空转
实现无锁元素类型限制批量操作
moodycamel::ConcurrentQueue支持
boost::lockfree::queue需平凡赋值/析构
tbb::concurrent_queue需平凡构造
std::queue + 互斥锁自行实现

查一查基准数据 📊

仓库自带 benchmarks/ 目录,可与 Boost、TBB、std::queue、dlib pipe、加锁队列等实现同场对比。代码覆盖 19 种负载场景,线程数最多 48,批量模式一次收发 2300 个元素(见 benchmarks.cpp 中的BULK_BATCH_SIZE)。作者给出的结论比较克制:重度竞争下批量操作的速度接近甚至超过非并发队列;如果你的业务逻辑本身较重,队列不会成为瓶颈。具体毫秒数未随仓库附带,按 README 步骤在 Linux 下编译运行即可复现。

核对测试与验证 ✅

  • 单元测试:tests/unittests/ 含 45 个 TEST 用例,连带覆盖了 c_api/ 的 C 接口
  • 模糊测试:tests/fuzztests/ 是长期运行的随机压力测试
  • 形式化验证:核心算法通过了 C++11 内存模型检查器 CDSChecker(tests/CDSChecker/),内部算法与集成流程另有 Relacy 模型检查器测试(tests/relacy/);CI 还会交叉编译 riscv64 跑单元测试

把队列接进项目 🔌

  • 拷贝头文件:直接把concurrentqueue.h放进项目,零配置
  • vcpkgvcpkg install concurrentqueue
  • CMake:CMakeLists.txt 是 header-only 的 INTERFACE 库,带安装与包配置,可独立安装后find_package

进阶入口:samples.md 整理了批量、token、异常安全、自定义 traits 等用法;C 语言项目可看 c_api/。

接下来做什么 📖

如果你的程序确实需要多线程共享数据,先把单头文件拷进工程,照着 samples.md 的 "Hello concurrency" 例子跑一遍。想评估性能,编译 benchmarks/ 在自己的机器上跑一次最实在。选型前建议读 README 的 "Reasons not to use" 一节:队列不保证线性化,多个生产者的元素出队顺序可能交错,对顺序有严格要求时请另选实现。

【免费下载链接】concurrentqueueA fast multi-producer, multi-consumer lock-free concurrent queue for C++11项目地址: https://gitcode.com/GitHub_Trending/co/concurrentqueue

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询