【发布时间】:2013-06-21 08:53:41
【问题描述】:
有没有人能很好地指出使用futures from the Boost thread library 和Boost ASIO 的示例?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口。
【问题讨论】:
标签: c++ multithreading boost boost-asio
有没有人能很好地指出使用futures from the Boost thread library 和Boost ASIO 的示例?我有一个现有的异步库,它使用回调函数,我想为其提供更友好的同步接口。
【问题讨论】:
标签: c++ multithreading boost boost-asio
如果不了解与现有异步库的交互,很难提供简洁的解决方案。尽管如此,这个answer 使用Boost.Future 和Boost.Asio 来实现一个主动对象模式。当creating a future 时,考虑检查现有的异步库以确定哪种方法更合适:
future 的函子。这个函子可以在 Boost.Asio io_service 的上下文中执行。可能需要一些额外的包装级别来与现有的异步库集成,以及解决右值语义。如果当前函数调用已经返回值,请考虑使用此方法。promise 作为参数,并在函数中填充它。 promise 将绑定到提供给 Boost.Asio io_service 的处理程序。与 boost::packaged_task 一样,它可能需要额外的包装级别来处理右值语义。最后,Boost.Asio 1.54(目前处于测试阶段)为C++ futures 提供一流的支持。这里是官方example。即使您目前无法使用 1.54 测试版,检查接口和实现也可能会有所帮助。
【讨论】:
你能看看这个例子吗:
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 就是一个很好的例子。
【讨论】: