О том, как использовать эти страшные корутины
Которые появились в С++20 (а должны были в 17!)
Мне они очень понравились
Да нам дали чрезвычайно запутанный и сложный набор инструментов
Такой, что 4 года спустя на всех конференциях до сих пор поднимается эта тема как нечто новое
(слайд миллион cppcon/cpp russia talks)
Я уверен, что они будут полезны многим, давайте посмотрим!
В моей практике я работаю с ВебРТС
И в в этой практике так случается что в коде события происходят асинхронно
Примеры: запуск субпроцесса, подключение клиента, обмен данными
Удаленные вызовы, ответ на которые будет готов потом
Делается это через коллбеки на низком уровне.
На высоком для удобства используется чтото вроде JS Promise
Стороняя заметка: строгая типизация и некоторые фичи C++17 очень помогают строго определять действия!
Что очень полезно! (nodiscard, constexpr if)
Жизнь хороша! Пишем бизнесуху!
Сгущаются тучи if-ов и for-ов (Тут примеры с псевдокодом как хочу / как получилось)
При любом ветвлении вспомогательная функция
При любом цикле асинхронная рекурсия
А мы все знаем, что рекурсия может привести к stack overflow
При любой обработке ошибок отделение потока управления
Вот бы в плюсах существовал механизм для спасения основного control-flow от ошибок!
Дааа, такой что еще и RAII подчищает за собой
Проблемы с захватом контекста
Скриншот с гига-трейсбэком
Черт побери, неужели у нас нет инструментов для решения?
Хочу как в питогнне, джсе
Хочу затащить их в проект, заводим экспериментальную веточку
(здесь выпадаем с тонны текста на cppref)
Распутаем этот клубок, пройдемся по самому важному
Краткое сравнение со Стэкфул
Корутины у нас кооперативные
Крик подобен грому - дайте людям Coro! (coroutine_type)
С помощью coro_traits можно подобно hash добавить поддержку чужому типу
Нужно по любому людям выдать Promise! (promise_type)
Гостям, конечно, нужен Prom, а он awaitable завтра днём (awaitable)
У у у у Скрипача std::coroutine_handle::from_promise
is handle.destroy() needed?
Давайте редис-лайк АПИ превратим в корутину
Более эффективно через pointer
await_suspend() other thread pitfall
Предыстория часть (отдышка):
История про перфоленты и огромная цена многопроходного компилятора Кобола
Через 4 года 70-летний юбилей корутинам!
И вот мы все пилим и пилим их, может ну его и возьмем готовое
Давайте посмотрим, что у нас есть по готовым библиотекам
qCoroSignalListener, который превращает сигналы в бесконечный async generator;
CppCoro - the most standalone
большой набор инструментов
(executors TS) - как и все хорошее soon(tm) (пугает меня если честно)
уже юзабелен для своих целей!
легко делаем сами (оборачиваем рантайм)