C++20 Coroutines: operator co_await
上篇介绍了 C++20 协程的诸多内容,独余 co_await 未曾涉及,它是协程中非常重要的一个关键字,用以支持挂起(suspend)和恢复(resume)的逻辑。 本篇便专门来对其进行介绍。 Awaitable type and Awaiter type 较于普通函数,协程支持挂起和恢复。那么何时挂起,何时恢复,便是逻辑之所在。 由于许多问题在解决时都无法立刻得到答案,即结果存在延迟性,在程序中就表现为阻塞。阻塞会导致CPU大量空闲,效率大减,于是就要想办法实现非阻塞。 多线程便是解决阻塞的一个方式,遇到阻塞,便由操作系统进行切换调度,以此实现非阻塞。重叠 IO 亦是一个非阻塞方案,遇到阻塞,提供一个回调函数给操作系统,系统在阻塞完成后调用其继续执行。 这些方案,本质上都是在处理如何挂起和恢复的问题。换言之,就是在遇到阻塞时暂停当前工作,先去进行别的工作,等阻塞完成后再回来继续完成当前工作。 既然拥有共同的处理问题的逻辑,那么对其进行抽象,便能得到一个高层级的类型。这个高层级的类型便是 Awaitable type(即上篇的 Awaitable object)。 简单地说,Awaitable type 就是对阻塞问题进行总结、归纳、提炼要点,所得到的模型。 那么有何好处呢? 好处就是,我们只要依照抽象后所得模型中的一些规则,便能定义出所有类似问题的解决逻辑,所有类似问题都能依此模型进行解决。 乍听很复杂,其实并不难,只要依规则行事便可。 那么具体规则又是什么? 其实只是三个接口: await_ready() await_suspend() await_resume() 它们分别代表着:是否阻塞、挂起、恢复。 将程序中阻塞完成的条件,写到 await_ready 函数中,便能依此决策何时挂起,何时恢复。 一个类型若直接实现了这三个接口,那么这个类就被称为 Awaiter。 什么意思呢?若类型 A 本身并未实现这三个接口,而是通过类型 B 实现的,那么类型 A 就称作 Awaitable,类型 B 称作 Awaiter。… Continue Reading C++20 Coroutines: operator co_await