ppl中的任务执行属性
Task execution properties in ppl
从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()
强制任务执行
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- C++概念:如何使用'concept'检查模板化结构的属性?
- 在C++中对T*类型执行std::move的意外行为
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 使用QProcess执行命令,并将结果存储在QStringList中
- 通过指向指针数组的指针访问子类的属性
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- MSVC是否支持C++11样式的属性而不是__declspec
- C++17中的并行执行策略
- GCC 生成代码或节具有读写和执行属性
- 使用命令行管理程序执行属性谓词的特定属性选项卡
- ppl中的任务执行属性