该代码使用C语言模拟实现了一个简单的线程池,并用循环队列和链式队列分别管理线程和任务。

主函数main的流程如下:

  1. 声明并初始化线程信息数组thread_info:
    • 初始化线程状态为TASK_INTERRUPTIBLE(等待状态)
    • 初始化线程号
    • 初始化线程任务信息为NULL
  2. 定义循环队列qtpc,并初始化。
  3. 将线程信息依次入队到循环队列qtpc: 构建线程池。
  4. 定义任务等待队列workq,并初始化。
  5. 显示当前线程状态和任务等待队列情况: 使用函数show_state展示。
  6. 循环读取任务信息:
    • 从用户输入读取任务的urllifecycle(生命周期)。
    • lifecycle小于等于0,则结束读取任务。
  7. 处理新任务:
    • 如果循环队列qtpc非空,则:
      • 从循环队列qtpc队头取出一个线程。
      • 将线程状态设置为TASK_RUNNING(运行状态)。
      • 将当前任务信息赋值给线程的任务成员。
    • 否则,如果任务等待队列workq未满,则:
      • 将任务信息入队到任务等待队列workq
    • 否则,如果任务等待队列workq已满,则:
      • 打印信息提示任务等待队列已满,拒绝新的请求任务。
  8. 显示当前线程状态和任务等待队列情况: 使用函数show_state展示。
  9. 更新线程任务的剩余时间:
    • 使用函数update_time模拟时间流逝,并更新线程任务的lifecycle
    • 如果线程任务已执行完毕,则将线程状态设置为TASK_INTERRUPTIBLE,释放任务信息,并将线程重新入队到循环队列qtpc
  10. 处理任务等待队列中的任务:
  • 如果循环队列qtpc非空且任务等待队列workq非空,则:
    • 不断从任务等待队列workq中取出任务,并将其分配给循环队列qtpc队头的线程。
  1. 循环步骤6到步骤10: 直到没有新的任务。
  2. 处理剩余任务:
  • 当循环队列qtpc非满时,继续更新线程任务的剩余时间,并检查任务是否执行完毕。
  • 如果循环队列qtpc非空且任务等待队列workq为空,则:
    • 继续从任务等待队列workq中取出任务,并分配给循环队列qtpc队头的线程。
  1. 循环步骤12: 直到循环队列qtpc已满。
  2. 销毁循环队列qtpc.
  3. 结束程序的执行。

代码中的循环队列和链式队列的应用:

  • 循环队列qtpc: 用于管理线程池中可用的线程。循环队列可以有效地实现线程的循环利用,避免了频繁的内存分配和释放。
  • 链式队列workq: 用于管理等待执行的任务。链式队列可以灵活地插入和删除任务,并方便地查看队列中排队的任务信息。

代码中使用了mallocfree函数来进行内存分配和释放,需要注意避免内存泄漏。

C语言线程池模拟实现:循环队列与链式队列的应用

原文地址: https://www.cveoy.top/t/topic/bhHg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录