ThreadLoom 是一款基于 C++17 的高性能任务调度框架,核心业务在于通过优先级管理实现复杂的并发任务控制。
核心功能
双模式任务模型:支持轻量化的 Lambda 表达式和可扩展的 Task 类继承。
严格优先级调度:内置 Critical 到 Low 四个等级,确保高优先级任务完成后再执行低优先级任务。
两阶段运行机制:采用“批量提交 -> 统一启动”模式,先排序再执行,保证调度的确定性。
完备的状态管理:支持任务的原子级取消、实时状态追踪(Pending/Running/Completed 等)及阻塞式等待(waitAll)。
适用场景
适用于对执行顺序有严格要求、且需要跨平台支持(Windows/Linux/macOS)的 C++ 并发开发场景。
1. 任务封装与状态管理 (Task 层)
多态与接口设计:系统的基础是 Task 基类,它定义了核心的纯虚函数 virtual void execute() = 0。Lambda 任务在底层实际上也是被包装成一个继承自 Task 的派生类(类似 FnTask),从而实现统一的接口调用。
无锁状态检查:任务的生命周期(Pending、Running、Completed、Failed、Cancelled)依赖 C++ 原子操作 (std::atomic) 进行管理。当外部调用 cancel() 时,仅原子性地修改标志位;任务在 execute() 内部通过 isCancelled() 读取该标志,实现线程安全、无阻塞的平滑取消,避免了强杀线程带来的资源泄露风险。
2. 调度器与队列机制 (Scheduler 层)
分级队列存储:为了实现 Critical > High > Normal > Low 的严格调度,调度器内部很可能维护了四个独立的 FIFO 队列(或一个按优先级稳定排序的优先队列)。submit() 操作只是将 std::unique_ptr 放入对应的队列中,此时不涉及任何线程计算。
分发器的“阻塞步进”算法:这是 ThreadLoom 确保优先级绝对顺序的核心机制。
调用 start() 后,唤醒独立的 Dispatcher 线程。
Dispatcher 从队列中弹出最高优先级的任务。
将该任务递交给底层的 ThreadPool。
关键实现:Dispatcher 随即调用类似 pool_.waitIdle() 的方法挂起自身,直到线程池报告该任务已执行完毕。
Dispatcher 被唤醒,继续抓取下一个最高优先级任务。这种机制在时间轴上强行隔断了不同任务的重叠执行。
3. 线程池与并发控制 (ThreadPool 层)
固定工作线程:在 Scheduler 实例化时,会根据参数(默认或指定)启动固定数量的 std::thread 工作线程,避免了运行期间频繁创建/销毁线程的系统调用开销。
锁与条件变量:底层调度严重依赖 std::mutex(互斥量)来保护共享的队列资源,防止多个线程同时读写引发数据竞争。结合 std::condition_variable(条件变量),工作线程在无任务时会进入休眠状态,释放 CPU 资源;当 Dispatcher 派发任务时,通过条件变量的 notify 唤醒工作线程。
全局屏障:主应用线程调用的 waitAll() 实际上是一个全局的条件变量阻塞点,它会一直等待,直到调度器确认内部队列为空且所有工作线程都处于空闲状态。