Есть ли у кого хороший указатель на примеры, которые используют futures from the Boost thread library с Boost ASIO? У меня есть существующая асинхронная библиотека, которая использует функцию обратного вызова, для которой я хотел бы предоставить более дружественный синхронный интерфейс.Использование фьючерсов с boost :: asio
ответ
Трудно предоставить краткое решение, не понимая взаимодействия с существующей асинхронной библиотекой. Тем не менее, этот answer использует Boost.Future и Boost.Asio для реализации шаблона активного объекта. Когда creating a future
, рассмотреть вопрос об изучении существующей библиотеки асинхронной, чтобы определить, какой подход является более целесообразным:
- boost::packaged_task обеспечивает функтор, который может создать
future
. Этот функтор может быть выполнен в контексте Boost.Asioio_service
. Некоторый дополнительный уровень обертывания может потребоваться для интеграции с существующей асинхронной библиотекой, а также для работы с семантикой rvalue. Подумайте об использовании этого подхода, если вызов текущей функции уже возвращает значение. - boost::promise обеспечивает объект нижнего уровня, который может иметь свое значение. Возможно, для изменения существующих функций необходимо принять
promise
в качестве аргумента и заполнить его внутри функции.promise
будет привязан к обработчику, который предоставляется Boost.Asioio_service
. Как и в случае сboost::packaged_task
, для обработки семантики rvalue может потребоваться дополнительный уровень обертывания.
И наконец, Boost.Asio 1.54 (в настоящее время находится в стадии бета-тестирования) обеспечивает первоклассную поддержку для C++ futures. Вот официальный example. Даже если вы не можете использовать бета-версию 1.54, может оказаться полезным изучить интерфейс и реализацию.
Можете ли вы посмотрите на этот пример:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp
Он показывает, как использовать std::future
с повышающего ASIO.
Ключевым моментом является то, чтобы включить файл use_future.hpp
:
#include <boost/asio/use_future.hpp>
Тогда вы можете написать такой код:
std::future<std::size_t> my_future =
my_socket.async_read_some(my_buffer, boost::asio::use_future);
Если вам нужно использовать boost::future
тогда я предложил бы реализовать другой вариант , аналогично boost::asio::use_future
.
Файл use_future.hpp
является хорошим примером для этого.
это никогда не работает, это заставляет asio блокировать навсегда – madduci
ну, такое решение активно используется в моем проекте. И это работает. Вы действительно знаете причину блокировки asio в вашем случае? –
По-видимому, этот код в примере блокируется в каждом будущем. Какой смысл использовать фьючерсы, если вы просто блокируете их? Возможно, просто используйте блокирующий код в первую очередь ... – kralyk