五种C++任务链实现方式:一用std::future/promise构建单向依赖链;二用std::coroutine_handle实现协程调度;三基于event loop回调注册;四用std::thread+无锁队列多线程分发;五结合std::packaged_task与thread_local栈实现嵌套转发。

一、基于 std::future 和 std::promise 构建任务链
该方法利用标准库中 std::promise 和 std::future 的配对机制,使前序任务通过 promise 设置值,后序任务通过 future 等待并获取该值,从而形成单向依赖的执行链条。每个节点封装一个可调用对象,并在完成时触发下一个节点的启动。
1、定义模板类 AsyncChainNode,内部持有 std::promise
2、在构造函数中接收一个 callable 对象,并将其绑定到成员函数 run() 中。
3、实现 then() 成员函数,接收下一个 callable,创建新节点,将当前节点的 future 与新节点的 promise 关联。
立即学习“C++免费学习笔记(深入)”;
4、在 run() 执行完毕后,调用 set_value() 触发后续节点的 future.wait() 返回。
二、使用 std::coroutine_handle 实现协程链式调度
该方法借助 C++20 协程原语,将每个异步任务封装为协程帧,通过手动调度 coroutine_handle 来控制执行顺序与上下文切换,避免线程阻塞并支持挂起/恢复语义。
1、定义结构体 Task,包含 coroutine_handle 及状态枚举(idle、running、done)。
2、重载 operator co_await,在 await_ready 返回 false 后,将当前 handle 存入前驱节点的 continuation 字段。
3、前驱任务结束时,调用 continuation.resume() 启动后继协程。
4、每个协程函数以 co_await suspend_always{} 开始,确保首次挂起,由调度器显式 resume。
三、基于 event loop 的回调注册链式模型
该方法模拟 JavaScript Promise.then 行为,构建一个轻量级事件循环,所有任务注册为回调,当上一任务 resolve 后,事件循环将下一回调加入待执行队列。
1、定义 EventLoop 类,维护 std::queue<:function>> pending_tasks 和运行标志 running。
2、定义 ChainPromise 模板类,包含 resolve 回调链 std::vector<:function>>。
3、调用 then() 时,将传入的 callable 压入回调链,并返回新的 ChainPromise 实例。
4、当 resolve(value) 被调用,遍历回调链,依次执行每个回调,并将前次结果 std::any_cast 后传递给下一次。
四、采用 std::thread + 无锁队列实现多线程任务链
该方法将链式任务分发至独立线程池,每个任务节点提交至 lock-free queue,由工作线程取出执行,并通过原子指针传递 next 任务地址,实现跨线程自动衔接。
1、使用 boost::lockfree::queue 或自实现 CAS-based queue 存储 std::shared_ptr
2、AsyncTask 抽象基类含纯虚函数 execute() 和 std::atomic
3、execute() 执行完毕后,检查 next_task 是否非空,若非空则将其 push 到队列尾部。
4、每个工作线程循环 pop 任务并调用 execute(),无需显式等待或条件变量同步。
五、基于 std::packaged_task 和线程局部存储的嵌套链式转发
该方法利用 packaged_task 封装可移动的 callable,并结合 thread_local std::stack<:packaged_task>> 实现同一线程内深度嵌套的任务链转发,适用于递归型异步展开场景。
1、定义 thread_local 静态栈 task_stack,用于暂存待延迟执行的 packaged_task。
2、每个任务执行时,从栈顶 pop 出下一个 packaged_task 并 invoke,若栈为空则直接返回。
3、then() 方法不立即提交,而是将新任务 push 到当前线程的 task_stack 中。
4、主任务入口点调用 run_with_chain(),在 try-catch 块中执行首个 packaged_task,并保证栈清空后再退出。


















