是否有人对使用Boost ASIO的 Boost 线程库中的期货的示例有很好的指导?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口。
问问题
10773 次
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::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
就是一个很好的例子。
于 2016-07-29T11:56:57.910 回答