Универсальный Task для C++20 coroutines: тип результата, политика запуска и владение coroutine state
olegiv2019 16 минут назад Универсальный Task для C++20 coroutines: тип результата, политика запуска и владение coroutine state Уровень сложности Средний Время на прочтение 14 мин Охват и читатели 1.2K C++ *...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. olegiv2019 16 минут назад Универсальный Task для C++20 coroutines: тип результата, политика запуска и владение coroutine state Уровень сложности Средний Время на прочтение 14 мин Охват и читатели 1. 2K C++ * Программирование * Системное программирование * Туториал В статье рассматривается заголовочный компонент execution_core::Task , предназначенный для использования как return object coroutine-функций C++20. Coroutine-функция в C++20 — это функция, в теле которой используется co_await , co_yield или co_return .
Для coroutine-функции promise type определяется через возвращаемый тип функции и std::coroutine_traits . Рассматриваемая реализация: задаёт promise_type для Task и Task при T ! = void ; задаёт две политики начальной приостановки: StartSuspended и StartImmediately ; хранит std::coroutine_handle ; уничтожает coroutine state через coroutine_handle::destroy() ; сохраняет исключение в std::exception_ptr ; для Task при T !
Технические детали
= void сохраняет результат в std::optional . Термин «модуль» далее используется в архитектурном смысле. Код является header-only компонентом.
Это не C++20 module unit, так как в нём используется #pragma once , а не export module . Почему выбран такой Task? C++20 coroutines задают языковой механизм приостановки и возобновления coroutine body, но не задают готовый универсальный тип результата для пользовательской coroutine-функции.
Coroutine-функция должна иметь return type. Для этого return type компилятор через std::coroutine_traits определяет promise_type . Следовательно, пользовательский тип Task нужен как тип результата coroutine-функции, через который задаются: тип promise object; объект, возвращаемый из coroutine-функции; способ получить std::coroutine_handle ; способ управлять lifetime coroutine state; место хранения результата или исключения; начальное состояние coroutine body после вызова coroutine-функции.
Отраслевые последствия
Без такого return object coroutine-функция не получает пользовательского объекта управления. Языковой механизм создаёт coroutine state и promise object, но пользовательскому коду нужен объект, через который этот state будет доступен и уничтожен. В данной реализации таким объектом является Task .
Он связывает coroutine-функцию, promise object и coroutine handle в один объект владения. В таком построении нет претензии на оригинальность: этот вариант наверняка не является уникальным и мог быть независимо реализован другими разработчиками. Здесь он рассматривается как один из возможных минимальных вариантов пользовательского return object для C++20 coroutine-функций.
Материал может быть полезен тем, кто хочет явно увидеть, как связаны promise_type , std::coroutine_handle , initial_suspend() , final_suspend() и lifetime coroutine state.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





