在PPL任务中进行构造的目的是什么?



我很有趣。似乎Visual Studio 2012还不支持它(可能是未来的CTP?)。它在标准C 11 async库中是否具有等效?

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

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

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

.then(then()函数在C 11中不存在

klaim已经做了一个很好的答案,但是我想我给出一个特定的例子。

.then将延续连接到任务,并且是等效于同步.get的异步。

c 11具有std::future,相当于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标准将阻止其击曲线,但是还有另一个建议可以使destructor unblocking tosloctor。因此,使用上述代码,您可以创建一个射击任务,该任务在计算后立即打印出答案。

等效的阻止是:

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

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

最新更新