一个函数返回了"协程接口",那么这个函数就是一个协程。
协程接口要求必须有promise_type
。(awaitable是另外的,非必须。)
协程句柄(代表协程)是编译器负责创建的,我们只管用就行了。
最小化示例如下:
cpp
#include <coroutine>
#include <iostream>
struct CoroutineInterface {
struct promise_type {
CoroutineInterface get_return_object() {
return CoroutineInterface(std::coroutine_handle<promise_type>::from_promise(*this));
}
auto initial_suspend() {
return std::suspend_always();
}
auto final_suspend()noexcept {
return std::suspend_always();
}
void return_void() noexcept {
}
void unhandled_exception() {
std::terminate();
}
};
CoroutineInterface(std::coroutine_handle<promise_type> co_handle) {
co_handle_ = co_handle;
}
std::coroutine_handle<promise_type> co_handle_;
};
CoroutineInterface GetNumbers() {
// co_wait initial_suspend();
for (int i = 0; i < 8; ++i) {
std::cerr << i << "\n";
co_await std::suspend_always();
}
// co_wait final_suspend();
co_return;
}
int main(void) {
CoroutineInterface co_interface = GetNumbers();
while (!co_interface.co_handle_.done()) {
std::cerr << "resume:";
co_interface.co_handle_.resume();
}
std::cerr << "successfully end\n";
return 0;
}
函数(协程)执行时,编译器会在代码块最前面执行cowait initial_suspend()
,并且在函数co_return
之前(或者在异常跳出之前)执行cowait final_suspend()
。
initial_suspend()
和final_suspend()
是标准库提供的两个awaitable(可等待体)。
initial_suspend()
和final_suspend()
分别用于控制协程开始、协程即将结束时是否要挂起(挂起后会转移执行权,可以转移给调用者,或者其他协程)。