C++ ppl 库中新创建的任务是否会自动执行,或者是否需要任何机制来启动上述任务的执行?
3 回答
立即安排任务。
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;
}
上述代码的输出将是
Task created
Task Running
结果为 42
如果您注释掉t.get()
,该任务将根本不会运行。您还可以使用t.wait()
来强制执行任务。