构建线程池的一个大致思路
- 设计线程池的数据结构(线程管理 任务管理 同步机制)
- 构造函数——初始化线程池(检查线程数和最大请求数是否合法。为线程池分配内存,创建指定数量的线程。使用 pthread_create 创建线程,并将 worker 函数作为线程入口。使用 pthread_detach 来分离线程,确保线程结束时能够自动回收资源。)
- 析构函数——清理资源
- 添加任务函数——将任务提交到任务队列(这里面注意要加锁、首先加锁保护队列,检查队列是否已满,如果队列未满,则将任务添加到队列中。)
- (私有成员函数)工作线程函数——从任务队列获取任务并处理(每个工作线程在 worker 函数中启动后,会调用 run 函数,run 函数的核心任务是不断地从任务队列中获取任务并执行。)
线程池的工作流程
- 初始化线程池:在构造函数中,线程池创建指定数量的线程,并使它们开始运行。
- 任务提交:主线程通过 append 函数提交任务,任务被加入到任务队列中。
- 任务处理:工作线程不断从任务队列中获取任务,执行任务,任务完成后继续获取下一个任务。
- 线程退出:当 m_stop 标志被设置为 true,线程池停止工作,工作线程退出。
线程池各部分详解
线程池的私有成员变量
线程池主要是由可以把这些私有成员变量看成三个部分
一个是线程管理 : 线程数量,线程池的数组
一个是任务管理 : 请求队列最大数量,请求队列
还有一个是同步机制:互斥锁 信号量
线程池的公有成员函数
主要分为构造函数 析构函数和添加任务函数append
构造函数
主要启动线程池 构造函数 主要用来初始化线程池,创建工作线程并分配资源 确保线程池具备处理任务的能力。
析构函数
主要是释放线程池的资源,防止内存泄漏,回收线程池所分配的内存资源。
append函数
Append函数主要是向任务队列中添加任务,确保任务能够被工作线程执行,控制队列容量。
线程池的私有成员函数
主要供线程池内部使用有worker和run函数
worker函数
Worker为什么是静态成员函数是因为静态成员函数没有 this 指针,与线程库的要求兼容。定义为 static 让worker可以直接作为pthread_create的入口函数。
作为线程的入口函数,由 pthread_create 调用。
每个线程执行 worker,启动线程池中的任务处理逻辑
run函数
这是线程的实际任务处理逻辑,线程会不断从任务队列中获取任务并执行。