有没有人有一个很好的指针指向使用futures from the Boost thread library和Boost ASIO的示例?我有一个现有的异步库,它使用回调函数,我希望为。
提供更友好的同步接口答案 0 :(得分:10)
如果不了解与现有异步库的交互,很难提供简洁的解决方案。尽管如此,这个answer使用Boost.Future和Boost.Asio来实现一个Active Object模式。在creating a future
时,请考虑检查现有的异步库以确定哪种方法更合适:
future
的仿函数。该仿函数可以在Boost.Asio io_service
的上下文中执行。可能需要一些额外的包装级别来与现有的异步库集成,以及解决rvalue语义。如果当前函数调用已经返回值,请考虑使用此方法。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
就是一个很好的例子。