三种C++定时任务调度方案:一、基于std::thread与优先队列的轻量级实现;二、基于C++23 sender/receiver的原生异步调度;三、基于Boost.Asio io_context的事件驱动分发架构。

一、基于 std::thread 与优先队列的轻量级调度器实现
该方案使用 C++11 标准库中的 std::priority_queue 维护待执行任务,结合 std::thread 启动独立调度线程,通过 std::condition_variable 实现低开销等待唤醒机制。任务对象需实现可比较接口以支持优先级排序,时间戳作为主键,优先级为次键,确保高优先级任务在相同时刻优先触发。
1、定义任务结构体 Task,包含 std::function
2、在调度器类中声明私有成员:std::priority_queue
3、在构造函数中启动 scheduler_thread,其入口函数循环执行:加锁获取队首任务 → 若队列为空则 wait_for(cv, lock, next_delay) → 若队首已到期则 pop 并异步调用 std::async(std::launch::async, task.func) → 解锁并重复循环。
4、提供 public 接口 add_task(Task&& t),加锁后将任务推入队列,并 notify_one 唤醒调度线程。
二、基于 std::execution::schedule 和 sender/receiver 模型的 C++23 原生异步调度
此方案利用 C++23 标准化协程与 executors 提案的初步实现(如 libunifex 或 GCC 14+ 内置支持),构建无锁、零拷贝、可组合的调度流水线。每个定时任务被封装为 sender,经由 schedule_after 调度器适配后,自动绑定至指定优先级的线程池 receiver,天然支持 cancel、join、on_error 等生命周期控制语义。
1、引入头文件
2、定义任务包装函数 make_scheduled_task,接收 std::chrono::nanoseconds delay、int priority、std::function
3、在主线程中调用 unifex::sync_wait(make_scheduled_task(500ms, 8, []{ printf("high prio job\n"); })) 启动单次任务;或使用 unifex::start_detached 启动后台常驻任务流。
4、确保 priority_thread_pool 内部维护多个优先级队列,worker 线程采用 work-stealing + 本地双端队列 + 全局多级队列混合策略,避免跨核缓存颠簸。
三、基于 Boost.Asio io_context 与 deadline_timer 的事件驱动分发架构
该方案复用 Boost.Asio 成熟的异步 I/O 基础设施,将定时任务抽象为 timer 事件,通过自定义 executor 绑定优先级语义。每个 timer 关联一个 std::shared_ptr
1、定义枚举 class PriorityLevel { LOW=0, MEDIUM=5, HIGH=10 },并声明 struct priority_tag { PriorityLevel level; };特化 boost::asio::associated_executor_t
2、构造 boost::asio::io_context 对象,派生 custom_executor 类,重载 execute() 方法:根据传入的 priority_tag.level 将任务 push_back 到对应 std::deque<:function>> 的子队列中。
3、启动多个 std::thread 调用 io_context.run(),并在每个线程内轮询:先检查 HIGH 队列非空则 pop_front 执行;否则查 MEDIUM;最后查 LOW;若全空则调用 io_context.poll_one() 处理原生 asio 事件。
4、封装 add_scheduled_task 函数:创建 boost::asio::steady_timer,设置 expiry,async_wait 后在回调中通过 custom_executor::execute(std::move(func), priority_tag{p}) 分发至目标优先级队列。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











