Повышение ASIO и co_await- использовать с любым сторонним обратным вызовом?

Простая функция:

awaitable<std::size_t> write(const std::vector<uint8_t>& data)
{
    auto token = co_await this_coro::token();

    return co_await async_write(serialport_, buffer(data), token);
}

Можно ожидать с помощью co_await write(my_data),

Это работает, когда я использую любую асинхронную функцию Boost ASIO.

Как можно было бы использовать этот шаблон, если бы асинхронная функция была некоторым обратным вызовом из какой-то не связанной библиотеки?

Код потенциально может выглядеть примерно так:

awaitable<bar> foo()
{
   auto token = co_await this_coro::token();

   return co_await third_party_callback;
}

И использование будет что-то вроде auto result = co_await foo(),

У меня возникают трудности с выяснением, какой самый простой / чистый путь к этому.

Дополнительный вопрос: Какова взаимосвязь между API сопрограмм Boost ASIO (например, токеном), библиотекой сопрограмм Boost и Coroutines TS?

0 ответов

Чтобы использовать другую библиотеку, другая библиотека должна была бы создать поддержку сопрограмм TS, или вы (или кто-то еще) должны были бы предоставить "склеивающий" код между тем, что требуется для сопрограмм TS, и сторонней библиотекой.

Усилия, чтобы сделать это, могут не сильно увеличиться, когда вы поймете, что сопрограммы TS требуют для работы.

Вы могли прочитать статьи Льюиса Бейкера о совместных программах TS. Сейчас есть много видео и статей от множества людей, освещающих эту тему. Как только вы понимаете требования, поддержка других типов ожидания становится простой, если у вас есть какой-то способ сообщить, когда подпрограмма co завершена, и у вас также есть некоторый контекст, чтобы продолжить выполнение подпрограммы co.

Если сторонняя библиотека - это просто тяжелая обработка. Возможно, вы захотите обернуть эту работу в какую-то ускоренную настройку будущего / обещания и использовать уже склеенный код ускорения потока, как этот (хотя примеры boost asio предшествуют экспериментальной поддержке boost asio).

Экспериментальный токен - это "клейкий" код между сопрограммой TS и boost asio (насколько я могу судить). Это не имеет ничего общего с библиотекой сопрограмм Boost.

Boost ASIO поддерживает 3 типа подпрограмм:

  • Stackless Coroutines - Усовершенствуйте собственную легковесную совместную библиотеку ASIO с помощью макросов препроцессора (существует уже давно)
  • Stackful Coroutines - использует библиотеку Boost Coroutine
  • Coroutines TS Support (экспериментальная) - использует CO рутинную TS (которая также не имеет стеков)
Другие вопросы по тегам