C语言线程池模拟实现:循环队列与链式队列的应用
该代码使用C语言模拟实现了一个简单的线程池,并用循环队列和链式队列分别管理线程和任务。
主函数main的流程如下:
- 声明并初始化线程信息数组
thread_info:- 初始化线程状态为
TASK_INTERRUPTIBLE(等待状态) - 初始化线程号
- 初始化线程任务信息为
NULL
- 初始化线程状态为
- 定义循环队列
qtpc,并初始化。 - 将线程信息依次入队到循环队列
qtpc中: 构建线程池。 - 定义任务等待队列
workq,并初始化。 - 显示当前线程状态和任务等待队列情况: 使用函数
show_state展示。 - 循环读取任务信息:
- 从用户输入读取任务的
url和lifecycle(生命周期)。 - 若
lifecycle小于等于0,则结束读取任务。
- 从用户输入读取任务的
- 处理新任务:
- 如果循环队列
qtpc非空,则:- 从循环队列
qtpc队头取出一个线程。 - 将线程状态设置为
TASK_RUNNING(运行状态)。 - 将当前任务信息赋值给线程的任务成员。
- 从循环队列
- 否则,如果任务等待队列
workq未满,则:- 将任务信息入队到任务等待队列
workq。
- 将任务信息入队到任务等待队列
- 否则,如果任务等待队列
workq已满,则:- 打印信息提示任务等待队列已满,拒绝新的请求任务。
- 如果循环队列
- 显示当前线程状态和任务等待队列情况: 使用函数
show_state展示。 - 更新线程任务的剩余时间:
- 使用函数
update_time模拟时间流逝,并更新线程任务的lifecycle。 - 如果线程任务已执行完毕,则将线程状态设置为
TASK_INTERRUPTIBLE,释放任务信息,并将线程重新入队到循环队列qtpc。
- 使用函数
- 处理任务等待队列中的任务:
- 如果循环队列
qtpc非空且任务等待队列workq非空,则:- 不断从任务等待队列
workq中取出任务,并将其分配给循环队列qtpc队头的线程。
- 不断从任务等待队列
- 循环步骤6到步骤10: 直到没有新的任务。
- 处理剩余任务:
- 当循环队列
qtpc非满时,继续更新线程任务的剩余时间,并检查任务是否执行完毕。 - 如果循环队列
qtpc非空且任务等待队列workq为空,则:- 继续从任务等待队列
workq中取出任务,并分配给循环队列qtpc队头的线程。
- 继续从任务等待队列
- 循环步骤12: 直到循环队列
qtpc已满。 - 销毁循环队列
qtpc. - 结束程序的执行。
代码中的循环队列和链式队列的应用:
- 循环队列
qtpc: 用于管理线程池中可用的线程。循环队列可以有效地实现线程的循环利用,避免了频繁的内存分配和释放。 - 链式队列
workq: 用于管理等待执行的任务。链式队列可以灵活地插入和删除任务,并方便地查看队列中排队的任务信息。
代码中使用了malloc和free函数来进行内存分配和释放,需要注意避免内存泄漏。
原文地址: https://www.cveoy.top/t/topic/bhHg 著作权归作者所有。请勿转载和采集!