这是一个线程池实现结合了多个异步编程示例。让我详细解释每个部分整体结构代码展示了多种 C11 异步编程技术的用法最后实现了一个完整的线程池。各部分详解1.第一部分std::async 的基本用法void task(const char* name) { std::cout name 开始执行线程ID: std::this_thread::get_id() std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout name 完成 std::endl; }演示了std::async的两种启动策略std::launch::async: 立即在新线程中执行std::launch::deferred: 延迟执行调用get()时才执行2.第二部分std::future 获取结果std::futureint result std::async(std::launch::async, simpleTask); int value result.get();展示了如何通过std::future::get()获取异步任务结果注意get()只能调用一次3.第三部分std::promise 和 std::futurestd::promisedouble prom; auto fut prom.get_future(); std::thread t(computeSqrt, std::move(prom), 9);std::promise用于在线程间传递结果可以从 promise 获取 future可以在另一个线程中设置值或异常4.第四部分std::shared_futurestd::shared_futureint sharedFut prom.get_future().share();多个线程可以共享同一个 futureget()可以多次调用通过share()从普通 future 创建 shared_future5.第五部分std::packaged_taskstd::packaged_taskint(int) task([](int x) { return x * x; }); std::futureint result task.get_future(); std::thread worker(std::move(task), 5);包装可调用对象可以获取关联的 future可以传递给线程执行6.第六部分任务队列和条件变量void taskRunner(std::queuestd::packaged_taskint() taskqueue, ...) { while (true) { std::unique_lockstd::mutex lock(task_mtx); cv.wait(lock, [taskqueue] { return !taskqueue.empty(); }); // 处理任务 } }使用std::condition_variable实现线程间通信工作线程等待任务有任务时被唤醒主线程添加任务到队列7.第七部分并行计算示例计算素数futures.push_back( std::async(std::launch::async, countPrimes, start, end) ); // 收集结果 int total1 0; for (auto fut : futures) { total1 fut.get(); }将大任务拆分成多个子任务使用std::async并行计算收集所有结果并汇总8.第八部分完整的 ThreadPool 类这是最重要的部分实现了一个生产级别的线程池核心设计class ThreadPool { private: std::vectorstd::thread workers; // 工作线程 std::queuestd::functionvoid() tasks; // 任务队列 std::mutex queue_mutex; // 队列互斥锁 std::condition_variable condition; // 条件变量 bool stop; // 停止标志 };关键方法构造函数创建指定数量的工作线程enqueue 方法提交任务到线程池析构函数优雅关闭线程池模板方法 enqueuetemplateclass F, class... Args auto enqueue(F f, Args... args) - std::futuretypename std::result_ofF(Args...)::type { // 1. 推导返回类型 using return_type typename std::result_ofF(Args...)::type; // 2. 创建 packaged_task auto task std::make_sharedstd::packaged_taskreturn_type()( std::bind(std::forwardF(f), std::forwardArgs(args)...) ); // 3. 获取 future std::futurereturn_type res task-get_future(); // 4. 将任务添加到队列 { std::unique_lockstd::mutex lock(queue_mutex); tasks.emplace([task]() { (*task)(); }); } // 5. 通知一个等待的线程 condition.notify_one(); return res; }工作线程循环for (;;) { std::functionvoid() task; { std::unique_lockstd::mutex lock(this-queue_mutex); // 等待条件线程池停止 或 队列不为空 this-condition.wait(lock, [this] { return this-stop || !this-tasks.empty(); }); // 线程池停止且队列为空 - 退出 if (this-stop this-tasks.empty()) return; task std::move(this-tasks.front()); this-tasks.pop(); } task(); // 执行任务 }9.主函数测试int main() { const int MAX 100000000; const int THREADS 8; ThreadPool pool(8); // 创建线程池 std::vectorstd::futureint futures; // 拆分任务并提交到线程池 for (int i 0; i THREADS; i) { int start i * chunk 1; int end (i THREADS - 1) ? MAX : (i 1) * chunk; futures.push_back( pool.enqueue(countPrimes, start, end) // 提交任务 ); } // 收集结果 int total1 0; for (auto fut : futures) { total1 fut.get(); // 阻塞等待结果 } std::cout 素数总数: total1 std::endl; return 0; }关键特性总结线程安全使用互斥锁保护共享资源任务队列FIFO 顺序执行任务条件变量高效等待任务优雅关闭析构时等待所有任务完成异常安全任务异常不会影响线程池通用接口支持任意可调用对象返回结果通过std::future获取任务结果使用场景需要大量并发执行的小任务避免频繁创建/销毁线程的开销控制并发线程数量实现生产者-消费者模式这个线程池实现是生产可用的包含了异常处理、资源管理和优雅关闭等关键特性。