五种C++任务链实现方案:一、std::promise/future手动封装;二、callback_on_ready轻量回调;三、Task类重载>>=链式语法;四、C++20协程+awaiter原生支持;五、Boost.Asio事件驱动链。

一、基于std::promise/std::future手动封装任务链
该方案通过显式管理每个阶段的std::promise与std::future生命周期,利用线程触发上游完成→下游设值的接力机制,实现非阻塞、可传递结果与异常的链式调度。核心在于为每阶段创建独立promise,并确保其在set_value()调用前持续有效。
1、定义模板函数then,接收上游std::future
2、在新std::thread中捕获移动后的prev future和p promise,调用prev.get()阻塞获取结果(在线程内不阻塞主线程)。
3、将prev.get()返回值传入回调f,执行后调用p.set_value();若抛异常,则捕获并调用p.set_exception(std::current_exception())。
立即学习“C++免费学习笔记(深入)”;
4、detach线程,返回新生成的std::future
二、使用callback_on_ready实现轻量回调注册
该方法规避了手动线程管理复杂度,将“等待就绪+执行回调”封装为独立函数,适用于单次后续动作场景。它不改变future本身结构,仅在其就绪后异步触发用户逻辑,适合嵌入现有流程而不侵入主链。
1、声明模板函数callback_on_ready,参数为右值引用std::future
2、在std::thread lambda中move捕获f和cb,调用f.wait()同步等待完成状态。
3、在try块内调用f.get()获取结果并立即传入cb执行;catch块捕获所有异常以防子线程终止。
4、调用detach()使线程后台运行,函数立即返回,不阻塞调用方。
三、构建Task类型支持operator>>=链式语法
该方案引入包装类Task
1、定义Task模板类,私有成员为std::future
2、实现and_then方法,接收lambda F,内部创建std::promise p,返回Task包裹p.get_future()。
3、在新线程中捕获move后的f_和p,调用f_.wait()后执行lambda,将返回值move给p.set_value()。
4、lambda参数声明为T&&,强制要求右值引用,防止大对象意外拷贝,提升移动效率。
四、采用C++20协程配合自定义awaiter实现原生链式
该方案利用co_await语法糖与自定义awaitable对象,在语言层面对齐异步链式表达,无需手动线程或promise管理。协程挂起/恢复由编译器调度,状态保存在协程帧中,天然支持异常传播与栈展开。
1、定义Task
2、实现await_transform方法,使Task可被co_await,返回自定义awaiter对象。
3、awaiter实现await_ready、await_suspend、await_resume,其中await_suspend注册续体到上游Task的完成队列。
4、用户代码使用co_await依次等待各阶段Task,编译器自动合成状态机,形成真正非阻塞、可中断、可组合的链式流。
五、集成Boost.Asio io_context构建事件驱动任务链
该方案依托Boost.Asio成熟调度器,将每个异步阶段注册为post或dispatch任务,利用io_context.run()统一驱动执行,天然支持取消、定时、优先级与跨线程调度,适用于IO密集型高并发场景。
1、创建boost::asio::io_context实例及关联的work_guard,防止run()提前退出。
2、使用post提交第一阶段任务,其完成时通过post再次提交第二阶段,依此类推,形成任务接力。
3、每个阶段任务内部通过boost::asio::post或async_wait触发下一级,共享同一io_context上下文。
4、调用io_context.run()启动事件循环,所有阶段按提交顺序或就绪顺序被线程池调度执行,无需手动管理线程或promise生命周期。


















