使用boost :: asio的期货

MrE*_*vil 10 c++ multithreading boost boost-asio

有没有人有一个很好的指向使用Boost线程库Boost ASIO的期货的例子?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口.

Tan*_*ury 10

如果不了解与现有异步库的交互,就很难提供简洁的解决方案.不过,这个答案使用Boost.Future和Boost.Asio来实现一个Active Object模式.在创建a时future,请考虑检查现有的异步库以确定哪种方法更合适:

  • boost :: packaged_task提供了一个可以创建的functor future.该仿函数可以在Boost.Asio的上下文中执行io_service.可能需要一些额外的包装级别来与现有的异步库集成,以及解决rvalue语义.如果当前函数调用已经返回值,请考虑使用此方法.
  • boost :: promise提供了一个可以设置其值的低级对象.可能需要修改现有函数需要接受promise作为参数,并在函数内填充它.该promise会绑定到提供给Boost.Asio的处理程序io_service.与此同时boost::packaged_task,它可能需要额外的包装级别来处理rvalue语义.

最后,Boost.Asio 1.54(目前处于测试阶段)为C++期货提供一流的支持.这是官方的例子.即使您目前无法使用1.54 beta,检查界面和实现也许是有益的.


Ale*_*iuk 6

你能看看这个例子:

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

它显示了如何使用std::futureboost asio.

关键点是包含文件use_future.hpp:

#include <boost/asio/use_future.hpp>
Run Code Online (Sandbox Code Playgroud)

然后你可以编写这样的代码:

std::future<std::size_t> my_future =
    my_socket.async_read_some(my_buffer, boost::asio::use_future);
Run Code Online (Sandbox Code Playgroud)

如果你需要使用boost::future那么我建议实现另一个变体,类似于boost::asio::use_future.
该文件use_future.hpp就是一个很好的例子.

  • 显然,示例中的代码阻止了每个未来。如果你只是阻止每个期货,那么使用期货有什么意义?不妨一开始就使用阻塞代码...... (3认同)
  • 好吧,我的项目中积极使用了这种解决方案。它有效。您确定您真的知道在您的情况下阻止 asio 的原因吗? (2认同)