Поделиться через


Класс task_group

Класс task_group представляет коллекцию параллельных задач, которые можно ожидать или отменить.

Синтаксис

class task_group;

Участники

Открытые конструкторы

Имя Описание
task_group Перегружен. Создает новый объект task_group.
Деструктор ~task_group Уничтожает объект task_group . Ожидается, что Вы вызовете метод wait или run_and_wait у объекта перед уничтожением, если только деструктор не выполняется в результате распускания стека из-за исключения.

Открытые методы

Имя Описание
cancel Прилагает все усилия, чтобы отменить вложенное дерево задач, управляемое этой группой задач. Каждая задача, запланированная в группе задач, будет отменена транзитивно, если это возможно.
is_canceling Сообщает вызывающему объекту о том, находится ли группа задач в настоящее время в процессе отмены или нет. Это не обязательно означает, что метод cancel был вызван для объекта task_group (хотя это, безусловно, квалифицирует этот метод для возврата true). Это может быть случай, когда task_group объект выполняется в режиме встроенного исполнения, а группа задач выше в дереве выполнения была отменена. В таких случаях, когда среда выполнения может заранее определить, что отмена будет проходить через этот task_group объект, true также будет возвращена.
запустить Перегружен. Планирует задачу в объекте task_group . Если объектtask_handle передается в качестве параметра кrun, вызывающий отвечает за управление жизненным цикломtask_handle объекта. Версия метода, которая принимает ссылку на объект функции в качестве параметра, включает выделение кучи внутри среды выполнения, которая может быть менее хорошо работает, чем с помощью версии, которая принимает ссылку на task_handle объект. Версия, принимающая параметр _Placement, заставляет задачу стремиться к выполнению в расположении, указанном этим параметром.
run_and_wait Перегружен. Планирует выполнение задачи в вызывающем контексте с использованием объекта task_group для полной поддержки отмены. Затем функция ожидает завершения или отмены всех работ над task_group объектом. Если объектtask_handle передается в качестве параметра кrun_and_wait, вызывающий отвечает за управление жизненным цикломtask_handle объекта.
ждать Ожидает завершения или отмены всех работ над task_group объектом.

Замечания

В отличие от строго ограниченного structured_task_group класса, task_group класс гораздо более общий. У него нет ограничений, описанных structured_task_group. task_group Объекты можно безопасно использовать в потоках и в произвольных формах. Недостатком task_group конструкции является то, что она не может показывать себя так же хорошо, как structured_task_group конструкция для задач, которые выполняют небольшие объемы работы.

Дополнительные сведения см. в разделе "Параллелизм задач".

Иерархия наследования

task_group

Требования

Заголовок: ppl.h

Пространство имен: конкурентность

Отмена

Прилагает все усилия, чтобы отменить вложенное дерево задач, управляемое этой группой задач. Каждая задача, запланированная в группе задач, будет отменена транзитивно, если это возможно.

void cancel();

Замечания

Дополнительные сведения см. в разделе "Отмена".

отменяется

Сообщает вызывающему объекту о том, находится ли группа задач в настоящее время в процессе отмены или нет. Это не обязательно означает, что метод cancel был вызван для объекта task_group (хотя это, безусловно, квалифицирует этот метод для возврата true). Это может быть случай, когда task_group объект выполняется в режиме встроенного исполнения, а группа задач выше в дереве выполнения была отменена. В таких случаях, когда среда выполнения может заранее определить, что отмена будет проходить через этот task_group объект, true также будет возвращена.

bool is_canceling();

Возвращаемое значение

Указание того, находится ли task_group объект в процессе отмены (или в любом случае будет вскоре).

Замечания

Дополнительные сведения см. в разделе "Отмена".

запускать

Планирует задачу в объекте task_group . Если объектtask_handle передается в качестве параметра кrun, вызывающий отвечает за управление жизненным цикломtask_handle объекта. Версия метода, которая принимает ссылку на объект функции в качестве параметра, включает выделение кучи внутри среды выполнения, которая может быть менее хорошо работает, чем с помощью версии, которая принимает ссылку на task_handle объект. Версия, принимающая параметр _Placement, заставляет задачу стремиться к выполнению в расположении, указанном этим параметром.

template<
   typename _Function
>
void run(
   const _Function& _Func
);

template<
   typename _Function
>
void run(
   const _Function& _Func,
   location& _Placement
);

template<
   typename _Function
>
void run(
   task_handle<_Function>& _Task_handle
);

template<
   typename _Function
>
void run(
   task_handle<_Function>& _Task_handle,
   location& _Placement
);

Параметры

_Функция
Тип объекта функции, который будет вызываться для выполнения текста дескриптора задачи.

_Func
Функция, которая будет вызываться для вызова текста задачи. Это может быть лямбда-выражение или другой объект, поддерживающий версию оператора вызова функции с подписью void operator()().

_Размещение
Ссылка на расположение, в котором должна выполняться задача, представленная параметром _Func.

_Task_handle
Дескриптор запланированной работы. Обратите внимание, что вызывающая сторона несет ответственность за время существования данного объекта. Среда выполнения будет продолжать ожидать, что он будет существовать до тех пор, пока не будет вызван метод wait или run_and_wait на этом объекте task_group.

Замечания

Среда выполнения планирует запуск предоставленной рабочей функции на более позднее время, которое может быть после возврата вызывающей функции. Этот метод использует объект task_handle для хранения копии предоставленной рабочей функции. Таким образом, любые изменения состояния, происходящие в объекте функции, передаваемом этому методу, не будут отображаться в копии этого объекта функции. Кроме того, убедитесь, что время существования всех объектов, которые передаются указателем или по ссылке на рабочую функцию, остаются действительными до тех пор, пока не будет возвращена рабочая функция.

Если task_group разрушается в результате очистки стека из-за исключения, вам не нужно гарантировать, что вызов был сделан к методу wait или run_and_wait. В этом случае деструктор будет соответствующим образом отменять и ожидать завершения задачи, представленной параметром _Task_handle .

Метод вызывает исключение invalid_multiple_scheduling, если дескриптор задачи, заданный параметром _Task_handle, уже был запланирован на объект группы задач методом run, и не было вмешивающегося вызова ни wait, ни run_and_wait метода в этой группе задач.

run_and_wait

Планирует выполнение задачи в вызывающем контексте с использованием объекта task_group для полной поддержки отмены. Затем функция ожидает завершения или отмены всех работ над task_group объектом. Если объектtask_handle передается в качестве параметра кrun_and_wait, вызывающий отвечает за управление жизненным цикломtask_handle объекта.

template<
   class _Function
>
task_group_status run_and_wait(
   task_handle<_Function>& _Task_handle
);

template<
   class _Function
>
task_group_status run_and_wait(
   const _Function& _Func
);

Параметры

_Функция
Тип объекта функции, который будет вызван для выполнения основной части задачи.

_Task_handle
Дескриптор задачи, которая будет выполняться встроенно в контексте вызова. Обратите внимание, что вызывающая сторона несет ответственность за время существования данного объекта. Среда выполнения будет продолжать ожидать, что она будет активно, до тех пор, пока метод run_and_wait не завершит выполнение.

_Func
Функция, которая будет вызываться для вызова текста работы. Это может быть лямбда-выражение или другой объект, поддерживающий версию оператора вызова функции с подписью void operator()().

Возвращаемое значение

Указание того, было ли ожидание удовлетворено или группа задач была отменена, либо из-за явной операции отмены, либо из-за исключения, возникшего в одной из задач. Дополнительные сведения см. в task_group_status.

Замечания

Обратите внимание, что одна или несколько задач, запланированных для этого task_group объекта, могут выполняться встроенным образом в контексте вызова.

Если одна или несколько задач, запланированных для этого task_group объекта, создают исключение, среда выполнения выберет одно из таких исключений и выведет его из вызова метода run_and_wait.

При возвращении из метода run_and_wait на объекте task_group среда выполнения сбрасывает объект в чистое состояние, где его можно повторно использовать. Это включает в себя случай, когда task_group объект был отменен.

В обычном пути выполнения у вас есть обязанность вызвать либо этот метод, либо метод wait до выполнения деструктора task_group.

группа задач

Создает новый объект task_group.

task_group();

task_group(
   cancellation_token _CancellationToken
);

Параметры

_CancellationToken
Токен отмены для ассоциации с этой группой задач. Группа задач будет отменена, когда будет отменен токен.

Замечания

Конструктор, который принимает токен отмены, создает task_group, которая будет отменена, когда будет отменен источник, связанный с этим токеном. Предоставление понятного токена отмены также изолирует эту группу задач от неявной отмены, инициированной родительской группой с другим токеном или без него.

группа_задач

Уничтожает объект task_group . Ожидается, что Вы вызовете метод wait или run_and_wait у объекта перед уничтожением, если только деструктор не выполняется в результате распускания стека из-за исключения.

~task_group();

Замечания

Если деструктор выполняется в результате нормального исполнения (например, не при очистке стека из-за исключения) и метод wait, и метод run_and_wait не были вызваны, деструктор может вызвать исключение missing_wait.

подождите

Ожидает завершения или отмены всех работ над task_group объектом.

task_group_status wait();

Возвращаемое значение

Указание того, было ли ожидание удовлетворено или группа задач была отменена, либо из-за явной операции отмены, либо из-за исключения, возникшего в одной из задач. Дополнительные сведения см. в task_group_status.

Замечания

Обратите внимание, что одна или несколько задач, запланированных для этого task_group объекта, могут выполняться встроенным образом в контексте вызова.

Если одна или несколько задач, запланированных для этого task_group объекта, создают исключение, среда выполнения выберет одно из таких исключений и выведет его из вызова метода wait.

Вызов wait на объекте task_group сбрасывает его в чистое состояние, чтобы его можно было повторно использовать. Это включает в себя случай, когда task_group объект был отменен.

В обычном пути выполнения у вас есть обязанность вызвать либо этот метод, либо метод run_and_wait до выполнения деструктора task_group.

См. также

Пространство имен параллелизм
Класс structured_task_group
Класс task_handle