Конечная приостановка в C++
Метод final_suspend срабатывает после завершения тела и решает, останется ли кадр на последней точке ожидания.
При std::suspend_always сопрограмма
останавливается уже после co_return,
и done у дескриптора становится
истинным. Запишем тело с выводом, затем
возобновим кадр и проверим флаг:
#include <coroutine>
#include <iostream>
struct tail {
struct promise_type {
tail get_return_object() {
return tail{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit tail(std::coroutine_handle<promise_type> handle)
: h(handle) {}
};
static tail finish() {
std::cout << "body\n";
co_return;
}
int main() {
tail job = finish();
job.h.resume();
std::cout << job.h.done() << "\n";
job.h.destroy();
return 0;
}
После единственного resume тело уже
отработало, done равен 1, и
повторный resume не вызывают -
дескриптор сразу уничтожают.
Настройте final_suspend на
std::suspend_always, доведите
сопрограмму до co_return одним
resume и выведите done.
Уничтожьте дескриптор вручную, когда
done истинен, не вызывая
resume повторно.