线程池是一种多线程处理形式,将任务添加到队列,创建线程后自动启动这些任务
- 降低资源消耗。线程池可以避免频繁的创建线程和销毁线程,线程池中线程可以重复使用
- 提高响应速度。线程池省去线程创建的这段时间
- 提高线程的可管理性。线程池可以对线程进行统一分配、调优和监控
线程池主要分为三个部分:
任务队列:存储需要处理的任务,由工作的线程来处理这些任务(函数地址)
- 通过线程池提供的 API 函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除
- 已处理的任务会被从任务队列中删除
- 线程池的使用者,调用线程池函数往任务队列中添加任务的线程就是生产者线程
工作的线程:任务队列任务的消费者 ,N个
- 线程池中维护了一定数量的工作线程,不停的读任务队列取出任务并处理
- 工作的线程相当于任务队列的消费者
- 如果任务队列为空,工作的线程将会被阻塞 (使用条件变量 / 信号量阻塞)
- 如果阻塞之后有了新的任务,由生产者将阻塞解除,工作线程开始工作
管理者线程:不处理任务队列中的任务,1个
- 周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测
- 当任务过多的时候,可以适当的创建一些新的工作线程
- 当任务过少的时候,可以适当的销毁一些工作的线程