假设我有一个允许发出异步请求的库,并返回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
上执行回调。
答案 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::future
或implement 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();
}