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

Ole*_*rov 2 c++ asynchronous visual-c++ c++11 ppl

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

Kla*_*aim 7

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

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

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

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


Xeo*_*Xeo 5

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

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

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

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

上面的代码片段将创建一个异步任务(启动时std::async),然后附加一个延续,std::future一旦上述任务完成,它就会传递完成的任务.这实际上返回另一个std::future用于任务,而目前C++的11个标准会阻止它的析构函数,但让析构函数疏导另一项建议.因此,使用上面的代码,您可以创建一个即发即弃的任务,一旦计算出答案就会打印出答案.

阻止等价物将是:

auto f = std::async(calculate_answer(the_question_of_everything));
std::cout << f.get() << "\n";
Run Code Online (Sandbox Code Playgroud)

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