【发布时间】:2015-10-22 10:42:54
【问题描述】:
C++ ppl 库中新创建的任务是否会自动执行,或者是否需要任何机制来启动上述任务的执行?
【问题讨论】:
标签: c++ visual-studio-2015 ppl
C++ ppl 库中新创建的任务是否会自动执行,或者是否需要任何机制来启动上述任务的执行?
【问题讨论】:
标签: c++ visual-studio-2015 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 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 工作线程。
【讨论】:
不,它不会自动启动:
#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()强制执行任务。
【讨论】: