10

是否有人对使用Boost ASIO的 Boost 线程库中的期货的示例有很好的指导?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口。

4

2 回答 2

11

如果不了解与现有异步库的交互,很难提供简洁的解决方案。尽管如此,这个答案使用 Boost.Future 和 Boost.Asio 来实现一个主动对象模式。创建 时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提供一流的支持。这是官方的例子。即使您目前无法使用 1.54 beta,检查接口和实现也可能是有益的。

于 2013-06-24T19:22:24.323 回答
5

你能看看这个例子吗:

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>

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

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

于 2016-07-29T11:56:57.910 回答