ppl中的任务执行属性

Task execution properties in ppl

本文关键字:执行 属性 任务 ppl      更新时间:2023-10-16

从c++ ppl库中创建的新任务是否自动执行,或者是否需要任何机制来启动上述任务的执行?

任务立即调度

concurrency::task构造函数调用
_TaskInitMaybeFunctor调用
_TaskInitWithFunctor<_ReturnType, _Function>调用
_ScheduleTask调用
_M_TaskCollection._ScheduleTask调用(除非您已经提供了自己的调度程序)
_DefaultPPLTaskScheduler().schedule;调用
(new _PPLTaskChore{ _Proc, _Param })->_Schedule;调用
_Schedule_chore调用
__crtCreateThreadpoolWork + _Reschedule_chore调用
__crtSubmitThreadpoolWork调用
SubmitThreadpoolWork

将任务提交到win32线程池。所以,是的,任务被立即调度

你不需要做任何事情来启动这个任务。

试试这样的代码:

#include "stdafx.h" // Windows.h for Sleep
#include <ppltasks.h>
#include <iostream>
using namespace concurrency;
using namespace std;
int main()
{
    // Create a task.
    task<int> t([]()
    {
        cout << "Task Runningn";
        return 42;
    });
    cout << "Task createdn";
    Sleep(5000L);
}

,您将在控制台输出中看到,程序退出之前:

Task Created
Task Running

Without Sleep()程序会立即退出并销毁任务。你可以用一些CPU密集型的操作来代替Sleep(),比如一个循环中的一个循环,这将使程序无法立即退出。或者直接添加:

std::cin.get();

结果将是相同的。您不需要调用get()或wait(),但是,如果您想捕获异常或处理取消,则需要添加continuation。在调试时,您可以启动并行堆栈窗口,您将看到任务调度程序除了主线程之外还创建了TPP工作线程。

不,它不会自动启动:

#include <ppltasks.h>
#include <iostream>
using namespace concurrency;
using namespace std;
int wmain()
{
    // Create a task.
    task<int> t([]()
    {
        cout << "Task Running" << endl;
        return 42;
    });
    cout << "Task created " << endl;
    wcout << "The result is " <<  t.get() << endl;    
}
以上代码的输出将是

任务创建
任务运行
结果是42

如果注释掉t.get(),则任务根本不会运行。您也可以使用t.wait()强制任务执行