使用boost :: asio的期货

时间:2013-06-24 18:29:16

标签: c++ multithreading boost boost-asio

有没有人有一个很好的指针指向使用futures from the Boost thread libraryBoost ASIO的示例?我有一个现有的异步库,它使用回调函数,我希望为。

提供更友好的同步接口

2 个答案:

答案 0 :(得分:10)

如果不了解与现有异步库的交互,很难提供简洁的解决方案。尽管如此,这个answer使用Boost.Future和Boost.Asio来实现一个Active Object模式。在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测试版,检查界面和实现也许是有益的。

答案 1 :(得分:5)

请看这个例子:

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp

它显示了如何将std::future与boost 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就是一个很好的例子。