【问题标题】:What is the purpose of .then construction in PPL tasks?.then 在 PPL 任务中构造的目的是什么?
【发布时间】:2012-11-04 12:49:18
【问题描述】:

我很感兴趣 .then 在 PPL 中构造的目的是什么,我在哪里可以测试它?似乎 Visual Studio 2012 还不支持它(可能是一些未来的 CTP?)。它在标准 C++11 异步库中是否有等价物?

【问题讨论】:

  • 文档是怎么说的?
  • Visual Studio 2012 确实支持 .then() 与 PPL,当您尝试使用它时遇到什么问题?

标签: c++ visual-c++ asynchronous c++11 ppl


【解决方案1】:

目的是让您能够表达必须按顺序执行的异步任务。

例如,假设我在一个 GUI 应用程序中。当用户按下按钮时,我想异步启动一个任务以在线检索文件,然后对其进行处理以检索某种数据,然后使用此数据更新 GUI。在此过程中,还有大量其他任务正在进行,主要是为了保持 GUI 响应。

这可以通过使用调用回调的回调来完成。 与 lambdas 关联的 .then() 功能允许您在实例化它的位置编写所有回调内容(如果需要,您仍然可以使用单独的回调)。 它也不保证每个单独任务的工作将由同一个线程完成,如果初始线程已经有太多工作要做,空闲线程就有可能窃取任务。

.then() 函数在 C++11 中不存在,但建议将其添加到 std::future 类(基本上是任务或任务结果的句柄)。

【讨论】:

    【解决方案2】:

    克莱姆已经给出了很好的答案,但我想我会举一个具体的例子。

    .then 为任务附加了一个延续,并且基本上与同步.get 等效。

    C++11 有std::future,相当于concurrency::taskstd::future目前只有.getbut there is a proposal to add .then (and other good stuff)

    std::async(calculate_answer(the_question_of_everything))
        .then([](std::future<int> f){ std::cout << f.get() << "\n"; });
    

    上面的 sn-p 将创建一个异步任务(以std::async 启动),然后在上述任务完成后附加一个通过已完成任务的std::future 的延续。这实际上为 that 任务返回了另一个 std::future,并且当前的 C++11 标准将阻塞它的析构函数 but there is another proposal to make the destructor unblocking。因此,使用上面的代码,您可以创建一个即发即弃的任务,该任务会在计算出答案后立即打印出来。

    阻塞等效项是:

    auto f = std::async(calculate_answer(the_question_of_everything));
    std::cout << f.get() << "\n";
    

    此代码将在f.get() 中阻塞,直到答案可用为止。

    【讨论】:

    • 老问题,但你能解释一下,为什么我不把calculate_answer(the_question_of_everything)std::cout &lt;&lt; f.get()... 打包成一个我会异步启动的通用函数/lambda?
    • @MikeMB:关注点分离,特别是因为异步调用可能远离您想要附加结果逻辑的点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2014-03-21
    • 2012-08-10
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多