线程池
# 概念
线程池就是一个拥有着许多的线程,可以当任务来临的时候直接让这些线对任务进行处理,而不需要这个时候在创建线程。
所以线程池中的线程是提前创建好的
# 作用
线程池可以增加效率,在处理任务的时候不需要浪费CPU创建线程的时间,所以可以增加效率
# 为什么要有线程池
创建/销毁线程会伴随着系统开销,过于频繁的创建/销毁线程会很大程度上的影响效率
线程并发数量过多,抢占系统资源造成堵塞
对线程进行一些简单的管理
例如:延迟执行,定时循环执行
# 四种线程池
可缓存的线程池
线程数没有限制
有空闲的线程,则使用空闲的线程;没用空闲线程则创建新的线程
一定程度减少频繁创建/销毁线程
定长线程池
可控制线程最大的并发数
超出线程数的线程会在任务队列中等待
周期性执行任务的线程池
也是定长的线程池,只不过可以周期性的执行任务
单线程化的线程池
有且只有一个线程执行任务
所有任务按照指定顺序执行,也就是遵循队列的入队出队的顺序
# 书写一个线程池
-
采用C++书写一个线程池
首先书写一个线程池要有这两个类:一个是任务类,还有一个是线程池的类
任务类
成员变量
执行该任务所需要的参数
例如:如果该任务是执行加减乘除的运算
那么需要的参数就有
操作数1,操作数2,结果,以及一个函数指针(用来告诉需要调用那个函数,从而挑选是要进行加减乘除的哪一个)
成员函数
构造函数
完成对于一个任务所需要的参数进行初始化
析构函数
进行一些清理工作
run函数
执行任务的函数,调用函数指针
线程池类
成员变量
任务队列
用来存放要被线程池执行的任务
线程数
该线程池中拥有多少个线程
判断状态
用来决定是否要退出线程池
互斥锁
完成对临界资源的保护
条件变量
用于实现任务与线程池中的线程的同步的问题
成员函数
Hander函数
执行任务的函数,用于对于任务队列中的任务进行处理
lock函数
完成加锁操作
unlock函数
完成解锁操作
noticeOneThread函数
唤醒该条件变量下的某一个线程
为了执行任务队列中的任务
noticeAllThread函数
唤醒该条件变量下的所有进程
为了退出该线程池,从而唤醒所有的进程,让每一个进程都退出
AddTask函数
向任务队列中增加任务
判断退出状态,如果_isStop为真的话,那么就不在向任务队列中增加任务了
GetTask函数
从任务队列中提取任务,从而将任务交给线程来做
IdleThread函数
让线程进入等待状态,等待任务的添加
判断退出状态,如果_isStop为真的话,那么就将线程都退出
IsEmpty函数
判断任务队列中的任务数是否为空
Stop函数
退出线程池,也就是将退出状态设置为空
InitThread函数
完成对于线程池的初始化,也就是创建ThraedNums个线程
最后再附上自己写的代码:(保存于github)
https://github.com/YKitty/LinuxDir/tree/master/LinuxCode/pthread/cpAndThreadPool/threadPool
下面是线程池的总结,以便快速复习和了解线程池: