线程池基本概念
线程池是一种线程使用模式,其思想非常类似于内存池,均是从性能出发而开发出来的一种优化技巧。线程池主要用在需要频繁执行较短的任务的情况下,由于短时间内如果进行大量线程的创建与销毁带来的开销是不可接受,因此通常预先创建好一些工作线程,然后在需要使用时直接将任务分派给空闲线程即可,同时可以根据任务数量动态增加减少内存池中的线程数量,在尽量将少资源占用的情况下获得较好的性能。
线程池特点
- 线程池数量限制
由于线程自身会占用系统资源,带来系统开销,因此个数并不是越多越好,但是如果太少将会降低并发性能,使得任务长期得不到服务,因此线程池数量需要有一个合理值。
- 适用于大量较短暂任务
一般而言,线程数量会小于并发任务量,因此如果任务时间很长,甚至和进程生命周期处在同一个数量级上,此时直接使用普通线程即可,无需使用线程池。
- 线程数量选取
一般而言,对于IO密集型线程,线程数量一般大于CPU数量,而计算密集型线程数量则取和CPU相同比较合理。
- 根据任务情况动态增减线程池中线程数量
初始线程池数量一般不直接创建到最大数量,因此在运行中需要根据任务情况动态进行线程的创建和销毁。
线程池基本结构
线程池的目的以及特点,可总结出线程池以及任务需要实现以下功能:
1. 线程池初始化:用于创建一定数量的线程
2. 线程池增加线程数量:用于任务过多时增加线程数量
3. 线程池销毁:销毁线程池
4. 往线程池中增加任务
结构体如下:
1 | //Condition.h文件 |
线程池实现
TaskBase是一个抽象基类,需要派生出不同的任务,所有任务需要的参数可以全部打包到void *taskArg成员变量中。以下为线程池的具体实现。
1 | //class Condition,实现于Condition.cpp |
测试代码如下所示:
1 |
|
线程池的代码可见:一个简单的Linux线程池实现