【Linux实战 】Linux 线程池的设计、实现与单例模式应用

【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,表示终止线程池的运行。

                      线程池的退