C++任务队列:库概述与实现

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++任务队列:从简单到复杂



任务队列(Task Queue)是多线程编程的关键模式之一。它允许组织异步执行工作:一个或多个生产者线程添加任务,而工作线程池则处理这些任务。在C++中,既有标准工具,也有专门的库可供使用。



1. 标准队列:带锁的 std::queue



最简单的方案是将 std::queue 与互斥锁和条件变量配合使用。这适用于同步开销不敏感的小型项目。



#include <queue>#include <mutex>#include <condition_variable>

template<typename T>class ThreadSafeQueue { std::queue<T> q_; mutable std::mutex mtx_; std::condition_variable cv_;public: void push(T value) { std::lock_guard<std::mutex> lock(mtx_); q_.push(std::move(value)); cv_.notify_one(); }

T pop() { std::unique_lock<std::mutex> lock(mtx_); cv_.wait(lock, [this]{ return !q_.empty(); }); T val = std::move(q_.front()); q_.pop(); return val; }};


优点:简单,内置于标准库。
缺点:每次操作都需加锁,可能出现争用和优先级反转。



2. boost::lockfree::queue —— 无锁队列



Boost库提供了基于CAS操作的无锁数据结构。boost::lockfree::queue 是一个无锁的多线程队列,使用固定或动态内存池。



#include <boost/lockfree/queue.hpp>

boost::lockfree::queue<int> queue(128); // 固定大小

void producer() { for (int i = 0; i < 1000; ++i) { while (!queue.push(i)) { // 如果队列已满,等待或丢弃 } }}

void consumer() { int value; while (queue.pop(value)) { process(value); }}


优点:队列规模较小时性能高,无锁。
缺点:调试复杂,大小受限(固定版本),需要内存回收。



3. Intel TBB (Threading Building Blocks) —— tbb::concurrent_queue



Intel TBB 是一个工业级的并行编程库。其 tbb::concurrent_queue(以及 tbb::concurrent_bounded_queue)针对高负载进行了优化。



#include <tbb/concurrent_queue.h>

tbb::concurrent_bounded_queue<Task> task_queue;task_queue.set_capacity(1024); // 限制大小

// 生产者task_queue.push(std::move(task));

// 消费者Task t;if (task_queue.try_pop(t)) { t.execute();}


优点:出色的可扩展性,支持有界/无界模式,与TBB任务调度器集成。
缺点:采用Apache 2.0许可证(之前为GPL),依赖整个TBB库。



4. 通过C++绑定使用 libdispatch (Grand Central Dispatch)



GCD 是Apple提供的队列管理系统,适用于macOS/iOS。C++有 dispatch/queue 封装。在Linux上可以使用 libdispatch(开源)。



#include <dispatch/dispatch.h>

dispatch_queue_t queue = dispatch_queue_create("com.example.myqueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ // 任务1});

dispatch_async(queue, ^{ // 任务2});

dispatch_release(queue);


优点:高效的线程管理,根据核心数自动扩展。
缺点:受限的

推荐