C++实现线程池详解及示例代码

4 下载量 10 浏览量 更新于2024-09-01 收藏 60KB PDF 举报
"C++线程池的简单实现方法" 在C++编程中,线程池是一种高效的多线程管理机制,它允许预先创建一组线程,这些线程等待任务分配而不是每次需要时创建新线程。这减少了线程创建和销毁的开销,提高了系统资源的利用率。本示例将介绍如何使用标准库组件如`std::thread`, `std::queue`, `std::mutex`, `std::atomic`, `std::condition_variable`等来构建一个简单的线程池。 首先,定义任务类(Task)和线程池类(Thread_Pool)。任务类包含一个`std::queue`来存储任务,以及一个互斥锁(`std::mutex`)用于同步对队列的操作。线程池类中,线程会不断从任务队列中取出任务执行,并使用`std::condition_variable`来控制线程的阻塞与唤醒。 任务类Task的实现: 1. `push(Func func)`:向任务队列中添加任务。使用互斥锁确保线程安全。 2. `getTaskNum()`:返回任务队列中的任务数量。 3. `pop()`:取出并执行队列头部的任务。同样需要互斥锁保护。 线程池类Thread_Pool的实现: 1. `addTasks(Func tasks)`:添加任务到线程池的任务队列,可能接收多个任务。 2. `start()`:启动线程池,创建工作线程并开始执行任务。 3. `stop()`:关闭线程池,停止工作线程。 4. `run()`:工作线程的主要工作函数,从任务队列中取出任务执行,如果队列为空,线程将被条件变量阻塞直到有新的任务到来。 在`Thread_Pool`的构造函数中,初始化一个布尔值`IsStart`表示线程池是否已启动。析构函数负责停止线程池并等待所有工作线程结束。 线程池的工作流程: 1. 当调用`start()`方法时,线程池会创建一定数量的工作线程,每个工作线程将进入`run()`方法。 2. 在`run()`方法中,工作线程会不断尝试从任务队列中获取任务。如果队列为空,`wait()`方法会阻塞当前线程,直到`notify_one()`被调用。 3. 当有新的任务添加到队列时,`notify_one()`会被调用,阻塞的线程会被唤醒,继续尝试获取任务并执行。 4. 当调用`stop()`方法时,线程池会设置`IsStart`为`false`,并唤醒所有等待的工作线程,它们会检查`IsStart`状态并结束。 这样的设计允许线程池动态调整其工作负载,根据需要创建和销毁线程,提高系统的响应性和效率。注意,实际应用中还需要考虑异常处理、任务完成后的清理、线程池大小的动态调整等问题,以提供更健壮的服务。