【Linux实战 】Linux 线程池的设计、实现与单例模式应用
前言:
在上文中我们实现了日志文件系统【Linux 实战】从0到1手搓日志系统:附完整代码-ZEEKLOG博客
本文我们再来看看线程池是如何实现的
线程池
线程池是预先创建一定数量可复用线程的集合,通过统一管理线程来执行任务,以减少线程频繁创建与销毁的开销,并控制并发线程数量,从而优化系统性能与资源利用率的机制。
设计思路
核心成员
同步工具:使用之前我们就封装好了的互斥锁Mutex、与条件变量Cond
线程池的封装:使用封装好的Thread、以及日志文件Log
使用STL容器:vector作为存储线程的容器、queue作为任务队列
线程池初始化
通过构造函数ThreadPool(int num)指定线程数量。
并在构造函数中创建num个线程对象,每个线程绑定一个任务处理函数:HandlerTask()
初始化完毕,等待Start()方法启动每个线程。
线程工作机制
每个线程都运行HandlerTask()函数,其HandlerTask()中的主要逻辑是:
1.线程启动后进入循环,通过互斥锁保护任务队列的访问。
2.当任务队列为空且线程池正常运行中,线程进入条件变量下等待。休眠计数器(_sleepnum)更新,用于后续的唤醒策略。
3.若不为空,或被唤醒则进行任务的获取以及处理。在锁外进行对任务的处理,避免长时间持有锁。
任务管理机制
任务通过Equeue()方法进入任务队列,类型为模板参数T。
添加任务时,使用互斥锁保证安全。
添加完任务后,如果全部线程都去休眠了,那么唤醒一个休眠线程,来处理任务。
线程池控制
Start():用于启动所有线程,并设置运行标志_isrunning = true。
Stop():设置运行标志位_isrunning = fasle,表示终止线程池的运行。
线程池的退