(如何)当std :: future准备就绪时,我可以在boost :: asio :: io_service上获得回调吗?

时间:2016-01-13 14:20:06

标签: c++ c++11 boost boost-asio future

假设我有一个允许发出异步请求的库,并返回std::future来查询(状态)结果。我想将该库与boost::asio::io_service集成,以便在未来准备好后立即在io_service循环中调用回调。有没有办法在不更改库或定期轮询io循环中的未来的情况下实现这一目标?

注意:有几个问题涉及反向问题,即在std::future上的某些操作完成时(例如Program to read asynchronously in boost asio with C++11 future)获得准备就绪的io_service。我无法找到实现完全相反的方法,即在io_service准备就绪时在future上执行回调。

2 个答案:

答案 0 :(得分:2)

通过使用then,您可以指定在未来准备就绪时执行某些操作:

future<T> my_future = lib::get_some_future();
my_future.then([] (future<T> f) {
    do_something_with_io_service(f.get())
}); // .then returns a new future (future<void> in this case) that allows chaining

但是请注意,从{+ 1}}开始,{+ 1}}缺少std::future成员函数。您可以使用boost::futureimplement it yourself

答案 1 :(得分:1)

如何生成一个守护程序线程来完成这项工作,如下所示:

#include <future>
#include <memory>
#include <thread>
#include <utility>
#include <boost/asio.hpp>

template <class Callback, class T>
void post_when_ready(boost::asio::io_service& iosvc,
                     std::shared_ptr<std::future<T>> ptr,
                     Callback callback) {
  std::thread{
    [=, &iosvc] {
      ptr->wait();
      // ...
      iosvc.post(std::move(callback));
    }
  }.detach();
}