【问题标题】:Using futures with boost::asio使用带有 boost::asio 的期货
【发布时间】:2013-06-21 08:53:41
【问题描述】:

有没有人能很好地指出使用futures from the Boost thread libraryBoost ASIO 的示例?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口。

【问题讨论】:

    标签: c++ multithreading boost boost-asio


    【解决方案1】:

    如果不了解与现有异步库的交互,很难提供简洁的解决方案。尽管如此,这个answer 使用Boost.Future 和Boost.Asio 来实现一个主动对象模式。当creating a future 时,考虑检查现有的异步库以确定哪种方法更合适:

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

    最后,Boost.Asio 1.54(目前处于测试阶段)为C++ futures 提供一流的支持。这里是官方example。即使您目前无法使用 1.54 测试版,检查接口和实现也可能会有所帮助。

    【讨论】:

      【解决方案2】:

      你能看看这个例子吗:

      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 就是一个很好的例子。

      【讨论】:

      • 好吧,这样的解决方案在我的项目中得到了积极的使用。它有效。您确定您真的知道在您的情况下阻塞 asio 的原因吗?
      • 显然,示例中的代码会阻塞每个未来。如果您只是阻止每个期货,那么使用期货有什么意义?还不如一开始就使用阻塞代码...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多