快速搞定多线程数据共享: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放进项目,零配置 - vcpkg:
vcpkg 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),仅供参考