Freigeben über


task_group-Klasse

Die task_group-Klasse stellt eine Sammlung paralleler Arbeiten dar, auf die gewartet oder die abgebrochen werden können.

Syntax

class task_group;

Mitglieder

Öffentliche Konstruktoren

Name Beschreibung
task_group Überladen. Erstellt ein neues task_group-Objekt.
~task_group Destruktor Zerstört ein task_group -Objekt. Es wird erwartet, dass Sie entweder die Methode wait oder die Methode run_and_wait für das Objekt aufrufen, bevor der Destruktor ausgeführt wird, es sei denn, der Destruktor wird aufgrund einer Ausnahme als Ergebnis der Stapelentpackung ausgeführt.

Öffentliche Methoden

Name Beschreibung
cancel Es wird eine bestmögliche Anstrengung unternommen, die Teilstruktur der Arbeit abzubrechen, die in dieser Aufgabengruppe verankert ist. Alle Aufgaben, die für die Aufgabengruppe geplant sind, werden, sofern möglich, auch transitiv abgebrochen.
wird_abgebrochen Informiert den Anrufer darüber, ob sich die Aufgabengruppe derzeit inmitten eines Abbruchvorgangs befindet. Dies weist nicht unbedingt darauf hin, dass die Methode cancel auf das Objekt task_group angewendet wurde (obwohl diese Methode sicherlich qualifiziert ist, um true zurückzugeben). Es kann vorkommen, dass das task_group Objekt im Inline-Modus ausgeführt wird und eine Aufgabengruppe weiter oben im Arbeitsbaum abgebrochen wurde. In Fällen wie diesen, in denen die Laufzeit im Voraus bestimmen kann, dass der Abbruch durch dieses task_group-Objekt erfolgt, wird true ebenfalls zurückgegeben.
run Überladen. Plant einen Vorgang für das task_group Objekt. Wenn ein task_handle Objekt als Parameter runübergeben wird, ist der Aufrufer für die Verwaltung der Lebensdauer des task_handle Objekts verantwortlich. Die Version der Methode, die einen Verweis auf ein Funktionsobjekt als Parameter verwendet, umfasst die Heap-Zuordnung innerhalb der Laufzeit, die möglicherweise weniger gut funktioniert als die Verwendung der Version, die einen Verweis auf ein task_handle Objekt verwendet. Die Version, die den Parameter _Placement verwendet, bewirkt, dass die Aufgabe auf die Ausführung an dem durch diesen Parameter angegebenen Speicherort voreingenommen wird.
ausführen_und_warten Überladen. Plant eine Aufgabe, die im Aufrufkontext mit der Hilfe des task_group-Objekts inline ausgeführt wird, um die vollständige Abbruchunterstützung zu gewährleisten. Die Funktion wartet dann, bis alle Arbeiten am task_group Objekt abgeschlossen oder abgebrochen wurden. Wenn ein task_handle Objekt als Parameter run_and_waitübergeben wird, ist der Aufrufer für die Verwaltung der Lebensdauer des task_handle Objekts verantwortlich.
wait Wartet, bis alle Arbeiten am task_group Objekt abgeschlossen oder abgebrochen wurden.

Hinweise

Im Gegensatz zur stark eingeschränkten structured_task_group Klasse ist die task_group Klasse viel allgemeiner. Sie hat keine der von structured_task_group beschriebenen Einschränkungen. task_group Objekte können sicher über Threads hinweg verwendet und auf freiformfähige Weise verwendet werden. Der Nachteil des task_group Konstrukts besteht darin, dass es nicht so gut wie das structured_task_group Konstrukt für Vorgänge ausgeführt werden kann, die kleine Arbeitsmengen ausführen.

Weitere Informationen finden Sie unter Task Parallelism.

Vererbungshierarchie

task_group

Anforderungen

Kopfzeile: ppl.h

Namespace: Parallelität

Abbrechen

Es wird eine bestmögliche Anstrengung unternommen, die Teilstruktur der Arbeit abzubrechen, die in dieser Aufgabengruppe verankert ist. Alle Aufgaben, die für die Aufgabengruppe geplant sind, werden, sofern möglich, auch transitiv abgebrochen.

void cancel();

Hinweise

Weitere Informationen finden Sie unter "Stornierung".

wird abgebrochen

Informiert den Anrufer darüber, ob sich die Aufgabengruppe derzeit inmitten eines Abbruchvorgangs befindet. Dies weist nicht unbedingt darauf hin, dass die Methode cancel auf das Objekt task_group angewendet wurde (obwohl diese Methode sicherlich qualifiziert ist, um true zurückzugeben). Es kann vorkommen, dass das task_group Objekt im Inline-Modus ausgeführt wird und eine Aufgabengruppe weiter oben im Arbeitsbaum abgebrochen wurde. In Fällen wie diesen, in denen die Laufzeit im Voraus bestimmen kann, dass der Abbruch durch dieses task_group-Objekt erfolgt, wird true ebenfalls zurückgegeben.

bool is_canceling();

Rückgabewert

Ein Hinweis darauf, ob sich das task_group Objekt mitten in einer Stornierung befindet (oder kurz darauf garantiert ist).

Hinweise

Weitere Informationen finden Sie unter "Stornierung".

ausführen

Plant einen Vorgang für das task_group Objekt. Wenn ein task_handle Objekt als Parameter runübergeben wird, ist der Aufrufer für die Verwaltung der Lebensdauer des task_handle Objekts verantwortlich. Die Version der Methode, die einen Verweis auf ein Funktionsobjekt als Parameter verwendet, umfasst die Heap-Zuordnung innerhalb der Laufzeit, die möglicherweise weniger gut funktioniert als die Verwendung der Version, die einen Verweis auf ein task_handle Objekt verwendet. Die Version, die den Parameter _Placement verwendet, bewirkt, dass die Aufgabe auf die Ausführung an dem durch diesen Parameter angegebenen Speicherort voreingenommen wird.

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
);

Parameter

_Funktion
Der Typ des Funktionsobjekts, das aufgerufen wird, um den Körper des Task-Handles auszuführen.

_Func
Eine Funktion, die aufgerufen wird, um den Hauptteil der Aufgabe auszuführen. Dies kann ein Lambda-Ausdruck oder ein anderes Objekt sein, das eine Version des Funktionsaufrufoperators mit der Signatur void operator()()unterstützt.

_Platzierung
Ein Verweis auf den Speicherort, an dem die durch den _Func Parameter dargestellte Aufgabe ausgeführt werden soll.

_Task_handle
Ein Handle für die geplante Arbeit. Beachten Sie, dass der Aufrufer für die Lebensdauer dieses Objekts verantwortlich ist. Die Laufzeit erwartet weiterhin, dass es vorhanden bleibt, bis entweder die wait- oder die run_and_wait-Methode für dieses task_group-Objekt aufgerufen wurde.

Hinweise

Die Laufzeitumgebung plant die bereitgestellte Arbeitsfunktion so ein, dass sie zu einem späteren Zeitpunkt ausgeführt wird, was möglicherweise nach Abschluss der aufrufenden Funktion erfolgt. Diese Methode verwendet ein task_handle-Objekt , um eine Kopie der bereitgestellten Arbeitsfunktion zu enthalten. Daher werden alle Zustandsänderungen, die in einem Funktionsobjekt auftreten, das Sie an diese Methode übergeben, nicht in Ihrer Kopie dieses Funktionsobjekts angezeigt. Stellen Sie außerdem sicher, dass die Lebensdauer aller Objekte, die Sie per Zeiger oder verweis auf die Arbeitsfunktion übergeben, gültig bleiben, bis die Arbeitsfunktion zurückgegeben wird.

Wenn der task_group-Destruktor als Ergebnis des Ablaufs des Stapels durch eine Ausnahme hervorgerufen wird, müssen Sie nicht garantieren, dass ein Aufruf an die wait- oder run_and_wait-Methode erfolgt ist. In diesem Fall wird der Destruktor ordnungsgemäß abbrechen und warten, bis die Aufgabe, die durch den _Task_handle Parameter dargestellt wird, abgeschlossen ist.

Die Methode löst eine invalid_multiple_scheduling Ausnahme aus, wenn das vom _Task_handle Parameter angegebene Aufgabenhandle bereits über die run Methode auf ein Aufgabengruppenobjekt eingeplant wurde und es keinen dazwischen liegenden Aufruf der wait oder run_and_wait Methode für diese Aufgabengruppe gab.

run_and_wait

Plant eine Aufgabe, die im Aufrufkontext mit der Hilfe des task_group-Objekts inline ausgeführt wird, um die vollständige Abbruchunterstützung zu gewährleisten. Die Funktion wartet dann, bis alle Arbeiten am task_group Objekt abgeschlossen oder abgebrochen wurden. Wenn ein task_handle Objekt als Parameter run_and_waitübergeben wird, ist der Aufrufer für die Verwaltung der Lebensdauer des task_handle Objekts verantwortlich.

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
);

Parameter

_Funktion
Der Typ des Funktionsobjekts, das aufgerufen wird, um den Inhalt der Aufgabe auszuführen.

_Task_handle
Ein Handle für die Aufgabe, die im aufrufenden Kontext inline ausgeführt wird. Beachten Sie, dass der Aufrufer für die Lebensdauer dieses Objekts verantwortlich ist. Die Runtime-Umgebung erwartet, dass sie weiterhin bis zum Abschluss der Ausführung der run_and_wait Methode live ist.

_Func
Eine Funktion, die aufgerufen wird, um den Textkörper der Arbeit aufzurufen. Dies kann ein Lambda-Ausdruck oder ein anderes Objekt sein, das eine Version des Funktionsaufrufoperators mit der Signatur void operator()()unterstützt.

Rückgabewert

Ein Hinweis darauf, ob die Wartezeit erfüllt oder die Aufgabengruppe abgebrochen wurde, aufgrund eines expliziten Abbruchvorgangs oder einer Ausnahme, die von einem seiner Aufgaben ausgelöst wird. Weitere Informationen finden Sie unter task_group_status.

Hinweise

Beachten Sie, dass eine oder mehrere der für dieses task_group Objekt geplanten Aufgaben inline im aufrufenden Kontext ausgeführt werden können.

Wenn mindestens eine der für dieses task_group Objekt geplanten Aufgaben eine Ausnahme auslöst, wählt die Laufzeit eine Ausnahme ihrer Wahl und propagiert sie aus dem Aufruf der run_and_wait Methode.

Nach der Rückkehr von der run_and_wait Methode auf einem task_group Objekt setzt die Laufzeit das Objekt in einen sauberen Zustand zurück, damit es wiederverwendet werden kann. Dies schließt den Fall ein, in dem das task_group Objekt abgebrochen wurde.

Im regulären Ausführungspfad sind Sie verpflichtet, entweder diese Methode oder die wait Methode aufzurufen, bevor der Destruktor von task_group ausgeführt wird.

Aufgaben_gruppe

Erstellt ein neues task_group-Objekt.

task_group();

task_group(
   cancellation_token _CancellationToken
);

Parameter

_CancellationToken
Ein Abbruch-Token, das mit dieser Aufgabengruppe verbunden ist. Die Aufgabengruppe wird beendet, wenn der Token beendet wird.

Hinweise

Der Konstruktor, der ein Abbruchtoken akzeptiert, erstellt ein task_group, das abgebrochen wird, wenn die dem Token zugeordnete Quelle abgebrochen wird. Wenn Sie ein explizites Abbruchtoken bereitstellen, wird diese Aufgabengruppe isoliert, sodass sie nicht an einem impliziten Abbruch durch eine übergeordnete Gruppe mit einem anderen Token oder ganz ohne Token beteiligt wird.

~task_group

Zerstört ein task_group -Objekt. Es wird erwartet, dass Sie entweder die Methode wait oder die Methode run_and_wait für das Objekt aufrufen, bevor der Destruktor ausgeführt wird, es sei denn, der Destruktor wird aufgrund einer Ausnahme als Ergebnis der Stapelentpackung ausgeführt.

~task_group();

Hinweise

Wenn der Destruktor als Ergebnis der normalen Ausführung (z. B. nicht aufgrund eines Stack-Unwindings durch eine Ausnahme) ausgeführt wird und weder die wait- noch die run_and_wait-Methoden aufgerufen wurden, kann der Destruktor eine missing_wait-Ausnahme auslösen.

warten

Wartet, bis alle Arbeiten am task_group Objekt abgeschlossen oder abgebrochen wurden.

task_group_status wait();

Rückgabewert

Ein Hinweis darauf, ob die Wartezeit erfüllt oder die Aufgabengruppe abgebrochen wurde, aufgrund eines expliziten Abbruchvorgangs oder einer Ausnahme, die von einem seiner Aufgaben ausgelöst wird. Weitere Informationen finden Sie unter task_group_status.

Hinweise

Beachten Sie, dass eine oder mehrere der für dieses task_group Objekt geplanten Aufgaben inline im aufrufenden Kontext ausgeführt werden können.

Wenn mindestens eine der für dieses task_group Objekt geplanten Aufgaben eine Ausnahme auslöst, wählt die Laufzeit eine Ausnahme ihrer Wahl und propagiert sie aus dem Aufruf der wait Methode.

Das Aufrufen wait eines task_group Objekts setzt es auf einen sauberen Zustand zurück, in dem es wiederverwendet werden kann. Dies schließt den Fall ein, in dem das task_group Objekt abgebrochen wurde.

Im regulären Ausführungspfad sind Sie verpflichtet, entweder diese Methode oder die run_and_wait Methode aufzurufen, bevor der Destruktor von task_group ausgeführt wird.

Siehe auch

Concurrency-Namespace
structured_task_group-Klasse
task_handle-Klasse