2

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

4

2 回答 2

7

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

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

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

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

于 2012-11-04T13:33:00.203 回答
5

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

.then将延续附加到任务,并且.get基本上是异步等效于同步的。

C++11 有std::future,相当于 a concurrency::taskstd::future目前只有.get但有建议添加.then(和其他好东西)

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

上面的代码片段将创建一个异步任务(使用 启动std::async),然后附加一个延续,std::future一旦上述任务完成,该延续就会传递给已完成任务。这实际上为该任务返回了另一个std::future当前的 C++11 标准会阻塞它的析构函数,但是还有另一个建议让析构函数 unblocking。因此,使用上面的代码,您可以创建一个即发即弃的任务,该任务会在计算出答案后立即打印出来。

阻塞等价物是:

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

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

于 2012-11-04T16:20:23.213 回答