3

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

4

3 回答 3

1

立即安排任务。

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线程池。所以是的,任务是立即安排的。

于 2017-01-08T16:22:17.787 回答
0

您无需执行任何操作即可开始任务。

试试这样的代码:

#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 Running\n";
        return 42;
    });

    cout << "Task created\n";
    Sleep(5000L);
}

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

Task Created
Task Running

如果没有 Sleep() 程序将立即退出并销毁任务。除了 Sleep() 之外,您还可以进行一些 CPU 密集型操作,比如在循环中设置一个循环,以防止程序立即退出。或者只是添加:

std::cin.get();

结果是一样的。您不需要调用 get() 或 wait() 但是,如果要捕获异常或处理取消,则需要添加延续。在调试时,您可以启动 Parallel Stacks 窗口,您将看到除了主线程之外,Task Scheduler 还创建了 TPP 工作线程。

于 2017-01-08T15:35:30.067 回答
-1

不,它不会自动启动:

#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;    
}

上述代码的输出将是

Task created
Task Running
结果为 42

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

于 2015-10-22T11:43:42.603 回答