final_suspend срабатывает после завершения тела и решает, останется ли кадр на последней точке ожидания.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrFs 582 of 696 menu
◀ ▶

Конечная приостановка в 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 повторно.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить