含义
线程池是一种线程使用模式。
意义
线程过多会带来调度开销,进而影响缓存的局部性和整体性能;而线程池维护着多个线程,等待着管理者分配可并发执行的任务,避免了在处理短时间任务时创建与销毁线程的代价;线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。
应用场景
- 需要大量的线程来完成任务,且完成任务的时间比较短;
- 对性能要求苛刻的应用,比如要求服务器迅速响应客户请求;
- 接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。
线程池实例
1)实现逻辑
- 创建固定数量的线程池,循环从任务队列中获取任务对象;
- 获取到任务对象后,执行任务对象中的任务接口;
- 即,实现有一个线程往任务队列里面塞任务,剩下的几个线程从任务队列里面拿任务进行处理。
2)代码实现
1. 创建Task任务类
class Task{
public:
int base;
public:
Task(){
}
Task(int _b):base(_b){
}
void Run(){
cout << "Thread id [" << pthread_self() << "]" << "task run ... done: base #" << base << " pow is #" << pow(base, 2) << endl;
}
~Task(){
}
};
2. 创建线程池
创建线程池,实现其基本功能:
void Put(Task &in)----往任务队列里面往任务,然后唤醒消费者去拿任务
void Get(Task &out)----从任务队列里面拿任务
void ThreadPoolInit()----初始化一堆处理任务的线程
static void *Routine(void *arg)----从任务队列中拿任务,然后处理任务
class ThreadPool{
private