标准库提供五种任务链实现方式:一用promise/future线性衔接;二用shared_future与lambda多级转发;三封装task_then语法糖;四以thread+atomic模拟then;五用C++20协程实现挂起恢复。

一、使用 std::promise 与 std::future 构建基础任务链
通过显式控制 promise 的 fulfill 时机,可在前序 future 就绪后触发后续异步任务的启动,形成线性依赖关系。该方式不依赖第三方库,完全基于标准库设施实现可控的任务流转。
1、声明一个 std::promise
2、调用 std::async 启动第一个任务,返回 std::future
3、在第一个任务完成回调中(通过 .wait() 或 .then 模拟),调用 promise.set_value() 触发下一个阶段。
4、第二个 std::async 的启动逻辑封装在 promise.get_future().then(...) 的等效手动轮询结构中,即在独立线程中 wait_until_ready 后执行后续函数。
二、基于 std::shared_future 与 lambda 捕获实现多级链式转发
std::shared_future 支持多次获取,允许单个上游结果被多个下游任务消费,同时保持执行顺序约束。结合 move-capture lambda 可传递非拷贝类型结果,避免冗余复制开销。
1、将首个 std::async 的 future 调用 .share() 得到 std::shared_future
2、构造第二个 std::async,其参数为一个捕获该 shared_future 的 lambda 表达式。
3、在 lambda 内部调用 shared_future.wait() 确保等待完成,再调用 .get() 获取值。
4、将该值作为输入传入下一级处理函数,并再次调用 std::async 启动第三阶段。
三、封装 task_then 辅助函数实现语法糖式链式调用
通过模板函数包装 std::async 与 future 组合逻辑,使用户能以 obj.then([](auto&& x){...}) 形式书写,提升可读性与复用性。该函数返回新的 future,支持连续调用。
1、定义模板函数 template
2、在函数体内创建 std::packaged_task
3、启动新线程执行该 packaged_task,传入 f.get() 结果。
4、返回该 packaged_task 的 future,作为链中下一环的输入。
四、利用 std::thread 与手动状态机模拟 then 行为
当需规避 std::async 的调度不可控性(如线程复用策略不确定)时,可直接使用 std::thread + std::atomic
1、为每个链节点分配一个 std::atomic
2、前驱任务完成时将对应标志置为 true,并调用 notify_one() 唤醒等待线程。
3、后继任务在线程入口处调用 std::condition_variable.wait() 监听该标志。
4、标志变为 true 后,执行计算逻辑并设置自身输出 future 的 promise 值。
五、通过 std::experimental::coroutine_handle 实现协程链式挂起恢复
在支持 C++20 协程的编译器环境下,可借助 promise_type 自定义挂起点,使 awaiter 在前序 future 就绪后自动恢复执行后续逻辑,实现零开销抽象的链式表达。
1、定义自定义 awaitable 类型,重载 await_ready 返回 future.valid() && future.wait_for(0s) == std::future_status::ready。
2、在 await_suspend 中注册 continuation 到 future 的完成回调(需借助平台特定扩展或手动线程池调度)。
3、await_resume 直接返回 future.get() 结果,供协程体后续使用。
4、编写 co_await 链式表达式:co_await first_task(); auto res = co_await second_task(res);。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











