2013-06-24 2 views
5

Есть ли у кого хороший указатель на примеры, которые используют futures from the Boost thread library с Boost ASIO? У меня есть существующая асинхронная библиотека, которая использует функцию обратного вызова, для которой я хотел бы предоставить более дружественный синхронный интерфейс.Использование фьючерсов с boost :: asio

ответ

7

Трудно предоставить краткое решение, не понимая взаимодействия с существующей асинхронной библиотекой. Тем не менее, этот answer использует Boost.Future и Boost.Asio для реализации шаблона активного объекта. Когда creating a future, рассмотреть вопрос об изучении существующей библиотеки асинхронной, чтобы определить, какой подход является более целесообразным:

  • boost::packaged_task обеспечивает функтор, который может создать future. Этот функтор может быть выполнен в контексте Boost.Asio io_service. Некоторый дополнительный уровень обертывания может потребоваться для интеграции с существующей асинхронной библиотекой, а также для работы с семантикой rvalue. Подумайте об использовании этого подхода, если вызов текущей функции уже возвращает значение.
  • boost::promise обеспечивает объект нижнего уровня, который может иметь свое значение. Возможно, для изменения существующих функций необходимо принять promise в качестве аргумента и заполнить его внутри функции. promise будет привязан к обработчику, который предоставляется Boost.Asio io_service. Как и в случае с boost::packaged_task, для обработки семантики rvalue может потребоваться дополнительный уровень обертывания.

И наконец, Boost.Asio 1.54 (в настоящее время находится в стадии бета-тестирования) обеспечивает первоклассную поддержку для C++ futures. Вот официальный example. Даже если вы не можете использовать бета-версию 1.54, может оказаться полезным изучить интерфейс и реализацию.

4

Можете ли вы посмотрите на этот пример:

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 является хорошим примером для этого.

+0

это никогда не работает, это заставляет asio блокировать навсегда – madduci

+1

ну, такое решение активно используется в моем проекте. И это работает. Вы действительно знаете причину блокировки asio в вашем случае? –

+0

По-видимому, этот код в примере блокируется в каждом будущем. Какой смысл использовать фьючерсы, если вы просто блокируете их? Возможно, просто используйте блокирующий код в первую очередь ... – kralyk