Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Что такое co_await в C++
- co_await — это ключевое слово C++20 для работы с корутинами. Оно используется для приостановки выполнения корутины до завершения асинхронной операции и последующего автоматического возобновления корутины, когда результат готов.
- Как работает co_await
- Только для корутин:
- Любая функция, содержащая co_await, автоматически становится корутиной. Все её локальные переменные и параметры сохраняются на куче, чтобы функция могла быть приостановлена и возобновлена без потери состояния.
- Механика:
- Когда компилятор встречает co_await expr;, он пытается получить специальный объект — awaiter — для выражения expr. Этот объект должен реализовывать три метода:
- await_ready() — возвращает true, если операция завершена и не нужно приостанавливать корутину.
- await_suspend(handle) — вызывается, если нужно приостановить корутину; получает дескриптор корутины, который можно использовать для её последующего возобновления.
- await_resume() — вызывается при возобновлении корутины и возвращает результат операции.
- Асинхронность:
- Если await_ready() возвращает false, корутина приостанавливается, управление возвращается вызывающему коду, а возобновление произойдет, когда асинхронная операция завершится. Если возвращает true, выполнение продолжается сразу.
- Пример:
- cpp
- co_await some_async_operation();
- // Эта строка выполнится только после завершения some_async_operation
- Отличие от обычного вызова функции
- Обычный вызов foo(); просто выполняет функцию синхронно и блокирует поток до завершения.
- co_await foo(); приостанавливает только корутину, не блокируя поток, и позволяет выполнять другие задачи до получения результата. После завершения асинхронной операции корутина автоматически возобновляется.
- Применение
- Асинхронный ввод-вывод:
- Позволяет писать асинхронный код в линейном стиле, без вложенных колбэков и сложной логики управления состояниями.
- Параллелизм:
- Несколько корутин могут ожидать разные события, не блокируя друг друга.
- Внутренние детали
- Тип, который можно использовать с co_await, называется awaitable.
- Awaitable может возвращать свой собственный awaiter через operator co_await, либо быть awaiter-ом сам по себе.
- Awaiter управляет всей логикой приостановки и возобновления корутины.
- Пример простого awaitable
- cpp
- struct simple_awaiter {
- bool await_ready() const noexcept { return false; }
- void await_suspend(std::coroutine_handle<>) const noexcept { /* ... */ }
- void await_resume() const noexcept { /* ... */ }
- };
- simple_awaiter some_async_operation();
- co_await some_async_operation();
- Итог
- co_await — это инструмент для приостановки и возобновления корутин в C++. Он позволяет реализовать асинхронное поведение без блокировки потоков, делая асинхронный код простым и читаемым.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement