asio 调度器实现 - coroutine 实现详解

asio 调度器实现 - coroutine 实现详解
最新回答
孤独的王后

2020-05-12 21:03:03

asio调度器中的coroutine实现详解

1. asio协程的基本概念和示例: asio的最新版本支持C++20的coroutine,通过co_await关键字可以方便地等待异步操作。 示例代码中,coro_test协程函数展示了如何使用steady_timer并通过co_await等待其超时。 asio::co_spawn用于执行协程,并可以设置回调函数来获取协程的返回值。

2. asio::co_spawn的实现机制: co_spawn有多个重载实现,但内部逻辑基本相似。 它通过co_spawn_entry_point帮助函数将原始业务协程包装为调度器协程。 随后构建相关的awaitable_thread并执行awaitable_handler构造函数和launch方法。

3. co_spawn_entry_point的作用: co_spawn_entry_point负责将原始协程包装为asio实现的协程。 通过二次包装实现额外的定制功能,如错误处理和协程与最终回调的串接。

4. awaitable_handler的实现细节: awaitable_handler与C++ coroutine的核心对象关联。 它使用awaitable作为可co_await的对象,awaitable_frame_base负责配置asio协程的行为。

5. awaitable的”&&“和”||“操作: 通过parallel_group实现,”&&“操作要求所有任务同时成功才返回成功后的tuple值,任何一个失败则返回错误。 “||“操作要求一个任务成功即返回成功,另一个任务则被取消。

6. 新版asio coroutine的实现改进: 最新版asio尝试简化coroutine的实现,移除复杂的线程与帧管理机制。 使用更简洁的方式实现coroutine,尽管此版本仍处于实验阶段。

7. 总结: asio协程的实现基于原async callback模式的兼容设计,包含大量的包装和复杂机制。 相比原实现,可读性、可维护性与整体性有所折扣,但提供了从callback到co_await的平滑过渡机制。 awaitable的扩展语义为业务提供了更灵活的异步控制,值得深入研究和学习。 新版本asio还尝试实现了类似Go channel的异步支持。