Свойства выполнения задачи в чел.
Выполняется ли вновь созданная задача из библиотеки 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() вы можете поместить некоторую интенсивную загрузку процессора, скажем, цикл внутри цикла, который бы не позволял программе выходить сразу. Или просто добавьте:
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()
форсировать выполнение задачи.