关于函数then()
的实现有几个问题在 Herb Sutter's talk .该函数用于链接异步操作,参数f
是一个操作和参数 w
的 future 是这个操作的“工作”(lambda)。
template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
return async([=]{ w(f.get()); });
}
应用示例如下:
std::future<int> f = std::async([]{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
auto f2 = then(std::move(f), [](int i){
return 2 * i;
});
主线程产生任务,但不等待其中任何一个完成。
首先,future<T>
没有复制构造函数。这意味着,建议的实现只能与 shared_future<T>
一起使用。除非我们将调用更改为 async()
将 future 转移到 lambda 中。 This SO question提出了一种方法,但它似乎太复杂了。我重新实现了这个函数,我想知道我的代码是否正确或者我是否遗漏了什么......
其次,传递给 then()
的 future 函数可能是 void
所以我们实际上需要 then()
的 2 个实现, 正确的? future 返还一份T
一个用于 future 返回 void
.
最后,then()
中的 lambda没有返回语句以便我们可以实际返回值?没有 return 语句,则返回 future<void>
对吧?
我试图解决以上几点,这就是我想出的。对吗?
template <typename T, typename Work>
auto then(future<T> f, Work w) -> future<decltype(w(f.get()))>
{
return async([](future<T> f, Work w)
{ return w(f.get()); }, move(f), move(w));
}
template <typename Work>
auto then(future<void> f, Work w) -> future<decltype(w())>
{
return async([](future<void> f, Work w)
{ f.wait(); return w(); }, move(f), move(w));
}
最佳答案
这种 .then() 方法的问题在于,您同时生成 2 个线程(代价高昂),其中第二个线程会阻塞其 future.get/wait(如果第一个线程运行时间足够长,类(class)) 因此,最好使用工作队列来序列化作业执行顺序(并重新循环现有线程)。 只需寻找一个好的线程池模式实现
关于c++ - 在c++ 11中实现future::then()等价于异步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14489935/