目录
c++协程类型
Result Coroutine() {
std::cout << 1 << std::endl;
co_await std::suspend_always{};
std::cout << 2 << std::endl;
std::cout << 3 << std::endl;
co_await std::suspend_always{};
std::cout << 4 << std::endl;
};
这里的Result就是c++中协程所对应的类型
其中 co_await 是个关键字,它的出现,通常来说就会使得当前函数(协程)的执行被挂起。
协程的状态
音频 | 协程 |
---|---|
音频文件 | 协程体 |
音频播放 | 协程执行 |
播放暂停 | 执行挂起 |
播放恢复 | 执行恢复 |
播放异常 | 执行异常 |
播放完成 | 协程返回 |
协程挂起时,我们需要记录函数执行的位置,C++ 协程会在开始执行时的第一步就使用 operator new
来开辟一块内存来存放这些信息,这块内存或者说这个对象又被称为协程的状态(coroutine state)
协程的状态不仅会被用于存放挂起时的位置(后称为挂起点),也会在协程开始执行时存入协程体的参数值。
例如:
Result Coroutine(int start_value) {
std::cout << start_value << std::endl;
co_await std::suspend_always{};
std::cout << start_value + 1 << std::endl;
};
需要注意的是,如果参数是值类型,他们的值或被移动或被复制(取决于类型自身的复制构造和移动构造的定义)
到协程的状态当中;如果是引用、指针类型,那么存入协程的状态的值将会是引用或指针本身,而不是其指向的对象,
这时候需要开发者自行保证协程在挂起后续恢复执行时参数引用或者指针指向的对象仍然存活。
协程的挂起
协程的挂起是协程的灵魂。C++ 通过 co_await 表达式来处理协程的挂起,表达式的操作对象则为等待体(awaiter)。
await_ready
bool await_ready();