C++ 开发必备:详解线程池实现原理与示例代码
线程池是一种多线程编程的技术,它可以在多个线程之间共享资源,提高程序的执行效率和响应能力。线程池的主要优点是它可以减少线程的创建和销毁的开销,从而提高程序的执行效率。 在C++中,可以使用标准库中的thread和future头文件来实现线程池。线程池通常由一个队列和一组线程组成,队列中存放着待执行的任务,线程池中的线程从队列中取出任务并执行。 以下是一个简单的线程池的实现: ```cpp #include <thread> #include <queue> #include <future> class ThreadPool { private: std::queue<std::function<void()>> taskQueue; std::vector<std::thread> workers; public: ThreadPool(size_t numThreads) : numThreads(numThreads) {} void addTask(std::function<void()> task) { taskQueue.push(task); } void joinAll() { for (auto& worker : workers) { worker.join(); } } private: size_t numThreads; void workerThread() { while (!taskQueue.empty()) { std::function<void()> task = taskQueue.front(); taskQueue.pop(); task(); } } }; ``` 在这个实现中,ThreadPool类有一个私有的队列taskQueue,用于存放待执行的任务,和一个私有的线程向量workers,用于存放线程。构造函数接受一个参数numThreads,表示线程池的大小。 addTask方法用于添加任务到队列中,workerThread方法用于从队列中取出任务并执行。ThreadPool类还有一个joinAll方法,用于等待所有线程完成任务。 使用线程池的示例代码如下: ```cpp ThreadPool pool(4); pool.addTask([]() { // 执行任务1 }); pool.addTask([]() { // 执行任务2 }); pool.joinAll(); ``` 在这个示例中,创建了一个包含4个线程的线程池,然后向线程池中添加了两个任务,最后等待所有任务完成。 ######[AI写代码神器 | 448点数解答 | 2023-11-09 00:49:30]
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)24
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)345
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)229
- 探秘 Linux sensors 原理:从硬件读取到数据监测的全面剖析(GPT | 407点数解答 | 2024-10-21 16:06:25)263
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)267
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)263
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)314
- Three.js 示例代码解析:优化场景渲染与注意要点(字节豆包 | 164点数解答 | 2025-02-27 23:30:20)263
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)465
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)356
- C语言:实现不超五位整数各位数值求和与输入验证( | 363点数解答 | 2024-03-09 14:33:57)269
- 实现不超五位整数各位数值求和,含输入验证功能 ( | 363点数解答 | 2024-03-09 14:36:23)278