02线程池的结构体描述信息
01线程池原理剖析
02线程池的结构体描述信息
03线程池的各个函数解析
04线程池完整的头文件和实现文件(.c)
直接看代码,代码里有详细的注释。
//描述任务队列的结构体
typedef struct {
void *(*function)(void *); /* 函数指针,回调函数 */
void *arg; /* 上面函数的参数 */
} threadpool_task_t; /* 各子线程任务结构体 */
/* 描述线程池相关信息 */
struct threadpool_t {
//两把锁与两个条件变量
pthread_mutex_t lock; /* 用于锁住本结构体 */
pthread_mutex_t thread_counter; /* 记录忙状态线程个数的琐 --busy_thr_num */
pthread_cond_t queue_not_full; /* 当任务队列满时,添加任务的线程(server主线程)阻塞,等待此条件变量.用于S/C之间 */
pthread_cond_t queue_not_empty; /* 任务队列里不为空时,通知等待任务的线程.用于Ser即主线程与各个子线程之间. */
//线程id
pthread_t *threads; /* 存放线程池中每个线程的tid。数组 */
pthread_t adjust_tid; /* 存管理线程tid */
//任务队列,记录客户端的任务请求
threadpool_task_t *task_queue; /* 任务队列 */
//线程个数的范围、实际存在的线程、正在工作的线程、准备销毁的线程
int min_thr_num; /* 线程池最小线程数 */
int max_thr_num; /* 线程池最大线程数 */
int live_thr_num; /* 当前存活线程个数 */
int busy_thr_num; /* 忙状态线程个数 */
int wait_exit_thr_num; /* 要销毁的线程个数 */
//任务队列的头尾指针、队列的实际大小、队列的上限个数
int queue_front; /* task_queue队头下标 */
int queue_rear; /* task_queue队尾下标 */
int queue_size; /* task_queue队中实际任务数 */
int queue_max_size; /* task_queue队列可容纳任务数上限 */
int shutdown; /* 标志位,线程池使用状态,true或false */
};