c++ - 在c++ 11中实现future::then()等价于异步执行

标签 c++ c++11 asynchronous concurrency

关于函数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/

相关文章:

c++ - 构造 chrono::time_point

c++ - 模板模板参数访问

c++ - 共享指针无需分配即可工作

c# - 如何等待异步调用完成?

c++ - 如何将 QTableWidget 添加到 QTreeWidget 中,但作为 QTreeWidgetItem

c++ - 在 QWebSockets 客户端检查 SSL 证书有效性的最佳实践

asynchronous - Flutter : Failed assertion: line 146: '<optimized out>' : is not true 中的 Dart future 问题

javascript - 如何在 Firefox 扩展中使用 nsIArrayBufferInputStream 将 ArrayBuffer 直接异步写入文件

c++ - 窗口坐标到摄像机角度?

c++ - 为什么编译器可以比普通函数更好地优化 lambda?