Повышение ASIO и co_await - использовать с любым сторонним обратным вызовом? - PullRequest
0 голосов
/ 01 марта 2019

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

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библиотека сопрограмм и сопрограммы TS?

1 Ответ

0 голосов
/ 04 марта 2019

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

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

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

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

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

Поддержка Boost ASIO3 типа подпрограмм:

...