线程池案例:
线程池模块分析:
-
1.main();
创建线程池。 向线程池中添加任务。借助回调处理任务。 销毁线程池。
-
2.pthreadpool_create();
创建线程池结构体 指针。 初始化线程池结构体{N个成员变量} 创建N个任务线程。 创建1个管理者线程。 失败时,销毁开辟的所有空间。(释放)
-
3.threadpool_thread()
进入子线程回调函数 接收参数void*arg-->pool结构体 加锁--》lock--》整个结构体 判断条件变量--》wait--------------170
-
4.adjust_thread()
循环10S执行一次。 进入管理者线程回调函数。 接收参数void*arg-->pool结构体 加锁---》lock--》整个结构体锁 获取管理线程池要用到变量。task_num,live_num,busy_num 根据既定算法,使用上述3变量,判断是否应该 创建、销毁线程池中 指定步长的线程。
-
5.threadpool_add()
-
总功能:
模拟生产任务。num【20】 设置回调函数,处理任务。sleep(1)代表处理完成。
-
内部实现:
加锁 初始化 任务队列结构体成员。 回调函数function,arg 利用环形队列机制,实现添加任务。借助队尾指针挪移%实现。 唤醒阻塞在 条件变量上的线程。 解锁
-
-
6.从3. 中的wait之后继续执行,处理任务。
加锁 获取 任务处理回调函数, 及参数 利用环形队列机制,实现处理任务。借助队头指针挪移%实现。 唤醒阻塞在条件变量 上的server。 解锁 加锁 该忙线程数++ 解锁
-
7.创建 销毁线程
管理者线程根据task_num,live_num,busy_num 根据既定算法,使用上述变量,判断是否应该 创建、销毁线程池中 指定步长的线程。 如果满足 创建条件
-
如果满足 销毁条件
wait_exit_thr_num=10; signal给 阻塞在条件变量上的线程 发送 假条件满足信号 跳转至 --170 wait阻塞线程会被假信号 唤醒。判断:wait_exit_thr_num>0 pthread_exit();
-