分类任务线程池设计咨询:同类别任务串行执行需求
适配同类任务互斥的线程池改造方案
针对你说的基于条件变量的线程池,要实现同一class标识的任务互斥执行,核心是在原有结构上增加同类任务的状态跟踪与队列调度,以下是具体的思路:
新增状态管理结构:
维护两个全局字典(所有操作必须用互斥锁保护):class_running:键是任务的class整数标识,值为布尔值,标记该类是否有任务正在运行。class_waiting_queues:键是class标识,值为一个队列,存放该类等待执行的任务。
同时保留原有的全局任务队列和条件变量,用于空闲线程获取可执行任务。
修改任务提交流程:
提交任务时先获取全局锁:- 检查该任务的class是否在
class_running中且值为True:- 如果是,把任务加入对应class的等待队列,释放锁即可。
- 如果不是,把任务加入全局任务队列,将
class_running[class_id]设为True,通过条件变量唤醒一个等待的线程,最后释放锁。
- 检查该任务的class是否在
修改线程执行循环:
线程从全局任务队列取到任务执行完成后(包括异常处理完成后),重新获取全局锁:- 检查该任务对应的class是否有等待队列且队列不为空:
- 如果有,从等待队列取出队首任务加入全局任务队列,唤醒一个等待线程(贴合原有线程从全局队列取任务的逻辑),无需修改
class_running状态(因为马上有下一个同类任务要执行)。 - 如果没有,将
class_running[class_id]设为False,释放锁后线程回到等待全局任务队列的状态(等待条件变量唤醒)。
- 如果有,从等待队列取出队首任务加入全局任务队列,唤醒一个等待线程(贴合原有线程从全局队列取任务的逻辑),无需修改
- 检查该任务对应的class是否有等待队列且队列不为空:
异常处理增强:
必须在任务执行的try/finally块中处理class状态更新,哪怕任务抛出异常,也要确保class_running的状态能被正确重置,或者等待队列的任务能被调度,避免同类任务永远无法执行。
这个方案完全基于你提到的条件变量线程池模式,没有改变原有线程的核心逻辑(空闲等待、被唤醒取任务),只是在任务的提交和完成阶段增加了同类任务的调度逻辑,可靠性和可维护性都比较高。
内容的提问来源于stack exchange,提问作者SukkoPera
相关产品推荐
相关产品推荐

