那么在PPL任务中构建的目的是什么?

时间:2012-11-04 12:49:19

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

我很有意思。在PPL中进行构建的目的是什么?我可以在哪里测试它?似乎Visual Studio 2012还不支持它(可能是未来的一些CTP?)。它在标准C ++ 11异步库中是否具有等价物?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:5)

Klaim已经做出了很好的回答,但我想我会给出一个具体的例子。

.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"; });

上面的代码片段将创建一个异步任务(使用std::async启动),然后附加一个延续,一旦上述任务完成,它就会传递完成任务的std::future。这实际上为那个任务返回了另一个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()中阻止,直到答案可用。