C++协程

协程是可以暂停和恢复的函数。协程用于实现异步逻辑,实现单线程中的并发任务。

仅当作笔记,内容还不完善!!

协程的优势:

  1. 性能强
  2. 语法优雅
  3. 未来的大方向

协议在被暂停以后,可以返回到

  1. 调度器(函数)
  2. caller(调用当前协程的协程)
  3. 直接恢复另一个协程(用另一个协程取代当前的协程)

协程的实现

co_await表达式

用于暂停协程,直到恢复。当协程运行,执行到了co_wait时,协程则直接返回。

不是所有的对象都可以等待。将可以被等待的对象称为可等待体。

如果要自己实现一个可等待体,则要求类型实现了await_readyawait_suspendawait_resume三个成员函数。

  • await_ready函数:用于判定可等待体是否已经准备好。
  • await_suspend函数:挂起点挂起时,调度协程的函数。
  • await_resume函数:用于接收异步执行的结果。

co_return表达式

设置返回类型的值,并通知挂起点,当前的协程已经完成。

需要实现一个promise_type

co_yield表达式

通常用于生成器上,会立刻返回一个值。

实现时,要必须要有promise_type类。可以用于自定义协程自身的行为,比如在挂起前与挂起后反做的事。可以将promise_type作为嵌套类型。对于那些无法修改的类型,那么可以通过特化coroutine_traits类型来实现。

promise_type有以下几个函数:

  1. get_return_object():用于返回值
  2. initial_suspend():提供在挂起前执行代码的机会,返回值有suspend_alwayssuspend_neversuspend_alwaysawait_ready函数中返回false,同时协程会在挂起点挂起并等等使用coroutine_handle激活恢复。suspend_never则相反。
  3. final_suspend():提供在挂起后执行代码的机会
  4. yield_value():用于获取co_yield从挂起点挂起后恢复的值。
  5. return_void():当co_return返回空时,则执行return_void()函数
  6. return_value():当co_return返回值时,则执行return_value函数