Свойства выполнения задачи в чел.

Выполняется ли вновь созданная задача из библиотеки 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() форсировать выполнение задачи.

Другие вопросы по тегам