执行与任务分离的组件— 线程池
wangbojing/threadpoolgithub.com多线程技术主要解决了处理器单元内多个线程执行的问题,它可以显著的减少处理器单元的闲置时间,增加处理器单元的吞吐能力。线程池是多线程编程的一个必要组件,并且对于很多编程人员都是透明的,更是神秘的。
线程池的概念,是一个用来管理一组执行任务线程的工具。既然是管理工具,那么该工具管理是用来管理任务与执行的。如图一线程池组件拓扑图,执行队列(Workers),任务队列(Jobs)和池管理(Pool Manager)三部分组成。
执行队列(Workers)是用来存放运行线程的队列。
任务队列(Jobs)是用来存放需要被执行的任务队列。
池管理(Pool Manager)主要是管理执行队列的执行顺序,执行任务的时间长短,对长时间没有使用的执行单元进行释放,执行单元满负荷运行的时及时添加执行单元;记录未执行的任务数量,对新任务入队,即将执行的任务出队等等。
执行队列(Workers)中的每一个执行单元(Worker)由哪些元素组成?线程ID,退出标志。
任务队列(Jobs)中的每一个任务(Jobs)的组成元素?执行每一个任务的具体执行函数,每一个任务的执行参数。
池管理(Pool Manager)由哪些元素组成?每一个新任务添加与执行时的移除用的互斥锁,每一个线程挂起的时所等待的条件变量。
根据分析如图二线程池的类图。
到这里一个简单的线程池就已经可以呼之欲出了。以下为实现代码
#include
这样的线程池还是只是一个Demo,原因有如下几点需要我们值得改进的。
- 线程池的线程数量是确定的,不能随着系统任务请求数量放缩线程池的大小。
- 任务数量的统计,并没有对任务队列进行统计
- 执行任务中的线程数量,等待执行的任务数量进行统计
- 每一个执行任务的时间没有做限制,
- IO密集型与计算密集型区分,线程池非常常用,但是根据不同的业务场景需要设置不同配置
- 在用户任务执行函数里,用户主动的调用了pthread_exit退出线程的保护机制
针对于以上几点问题,改进了一版线程池
#include