if (pool->task_list == NULL || pool->tids == NULL)
{
perror("分配内存错误");
return false;
}
// 对任务链表中的节点的指针域进行初始化
pool->task_list->next = NULL;
// 设置线程池中处于等待状态的任务数量最大值
pool->max_waiting_tasks = MAX_WAITING_TASKS;
// 设置等待线程处理的任务的数量为0,说明现在没有任务
pool->waiting_tasks = 0;
// 设置线程池中活跃的线程的数量
pool->active_threads = threads_number;
int i;
// 循环创建活跃线程
for (i = 0; i < pool->active_threads; i++)
{
// 创建线程 把线程的ID存储在申请的堆内存
if (pthread_create(&((pool->tids)[i]), NULL,
routine, (void *)pool) != 0)
{
perror("创建线程错误");
return false;
}
}
return true;
}
复制代码
线程池初始化流程图
mermaid
graph TD A[初始化线程池] --> B[初始化互斥锁] B --> C[初始化条件变量] C --> D[分配任务链表内存] D --> E[分配线程ID数组内存] E --> F{内存分配是否成功?} F -- 否 --> G[打印错误信息] F -- 是 --> H[设置初始值] H --> I[创建指定命量线程] I --> J[线程池初始化完成]add_task() 向线程池添加任务
graph TD A[主函数开始] --> B[定义线程ID] B --> C[创建计时线程] C --> D[初始化线程池] D --> E[分配内存给线程池] E --> F[初始化线程池,创建2个线程] F --> G[添加任务] G --> H[打印信息: throwing 3 tasks...] H --> I[添加任务1] I --> J[添加任务2] J --> K[添加任务3] K --> L[检查活跃线程数量] L --> M[打印当前活跃线程数] M --> N[等待9秒] N --> O[添加更多任务] O --> P[打印信息: throwing another 2 tasks...] P --> Q[添加任务4] Q --> R[添加任务5] R --> S[添加线程] S --> T[添加2个线程] T --> U[等待5秒] U --> V[删除线程] V --> W[打印信息: remove 3 threads...] W --> X[删除3个线程] X --> Y[销毁线程池] Y --> Z[销毁线程池并释放资源] Z --> AA[主函数竣事]thread_pool.h
printf("[%u] is joined\n", (unsigned)pool->tids[i]); // 打印线程退出信息
}
// 3, 销毁线程池
free(pool->task_list); // 释放任务链表内存
free(pool->tids); // 释放线程ID数组内存
free(pool); // 释放线程池结构体内存
return true;
}
复制代码
线程执行的任务函数流程图
void *routine(void *arg)
mermaid
graph TD A[线程执行的任务函数开始] --> B[注册取消处理惩罚函数] B --> C[加锁] C --> D{是否有任务 且 线程池未关闭?} D -- 否 --> E[等待条件变量] D -- 是 --> F{是否没有任务 且 线程池已关闭?} F -- 是 --> G[解锁并退出线程] F -- 否 --> H[取出任务] H --> I[从链表中移除任务] I --> J[减少等待任务计数] J --> K[解锁] K --> L[取消注册的取消处理惩罚函数] L --> M[禁止线程取消] M --> N[执行任务] N --> O[允许线程取消] O --> P[释放任务内存] P --> A销毁线程池流程图
mermaid
graph TD A[销毁线程池] --> B[设置关闭标记] B --> C[唤醒全部等待线程] C --> D[等待全部线程停止] D --> E[释放任务链表内存] E --> F[释放线程ID数组内存] F --> G[释放线程池布局体内存] G --> H[线程池销毁完成]参考