Sdílet prostřednictvím


structured_task_group – třída

Třída structured_task_group představuje vysoce strukturovanou kolekci paralelní práce. Jednotlivé paralelní úkoly můžete zařazovat do fronty na structured_task_group objekty pomocí task_handle objektů a čekat na jejich dokončení nebo zrušit skupinu úloh před dokončením provádění, což přeruší všechny úkoly, které nezačaly provádění.

Syntaxe

class structured_task_group;

Členové

Veřejné konstruktory

Název Popis
structured_task_group Přetíženo. Vytvoří nový structured_task_group objekt.
~structured_task_group Destruktor structured_task_group Zničí objekt. Očekává se, wait že zavoláte objekt nebo run_and_wait metodu před spuštěním destruktoru, pokud se destruktor nespouštějí v důsledku odvíjení zásobníku kvůli výjimce.

Veřejné metody

Název Popis
zrušit Snaží se zrušit dílčí strom práce v této skupině úloh. Pokud je to možné, zruší se každý úkol naplánovaný ve skupině úloh.
is_canceling Informuje volajícího, zda je skupina úkolů právě uprostřed zrušení. To nemusí nutně znamenat, že cancel metoda byla volána na structured_task_group objekt (ačkoli to jistě kvalifikuje tuto metodu k vrácení true). Může se jednat o případ, že structured_task_group se objekt spouští v textu a skupina úloh dále v pracovním stromu byla zrušena. V případech, kdy modul runtime může předem určit, že zrušení projde tímto structured_task_group objektem, true se vrátí také.
Spusťte Přetíženo. Naplánuje úkol na objektu structured_task_group . Volající spravuje životnost objektu task_handle předaného v parametru _Task_handle . Verze, která přebírá parametr _Placement , způsobí, že úloha bude zkreslená vůči spuštění v umístění určeném tímto parametrem.
run_and_wait Přetíženo. Naplánuje úlohu tak, aby byla spuštěna v kontextu volání s pomocí objektu structured_task_group pro plnou podporu zrušení. task_handle Pokud je objekt předán jako parametr run_and_wait, volající je zodpovědný za správu životnosti objektutask_handle. Funkce pak počká, dokud se nedokončí nebo zruší všechna práce na objektu structured_task_group .
Počkej Čeká, až se všechna práce na structured_task_group dokončení nebo zrušení zruší.

Poznámky

Pro získání výkonu existuje řada závažných omezení použití objektu structured_task_group :

  • Jeden structured_task_group objekt nemůže používat více vláken. Všechny operace s objektem structured_task_group musí provádět vlákno, které objekt vytvořilo. Dvě výjimky tohoto pravidla jsou členské funkce cancel a is_canceling. Objekt nemusí být v seznamu zachycení výrazu lambda a použit v rámci úkolu, pokud úkol nepoužívá některou z operací zrušení.

  • Všechny úkoly naplánované na structured_task_group objekt jsou naplánovány pomocí task_handle objektů, které je nutné explicitně spravovat životnost.

  • Více skupin lze použít pouze v naprosto vnořeném pořadí. Pokud jsou deklarovány dva structured_task_group objekty, druhý objekt deklarován (vnitřní jeden) musí destrukci před jakoukoli metodou kromě cancel nebo is_canceling je volána na první (vnější). Tato podmínka platí v obou případech, kdy jednoduše deklarujete více structured_task_group objektů ve stejných nebo funkčně vnořených oborech a také v případě úlohy, která byla zařazena do structured_task_group fronty prostřednictvím run nebo run_and_wait metod.

  • Na rozdíl od obecné task_group třídy jsou všechny stavy ve structured_task_group třídě konečné. Jakmile do skupiny zařadíte úkoly do fronty a počkáte na jejich dokončení, nemusíte stejnou skupinu znovu používat.

Další informace naleznete v tématu Paralelismus úkolu.

Hierarchie dědičnosti

structured_task_group

Požadavky

Hlavička: ppl.h

Namespace: souběžnost

zrušit

Snaží se zrušit dílčí strom práce v této skupině úloh. Pokud je to možné, zruší se každý úkol naplánovaný ve skupině úloh.

void cancel();

Poznámky

Další informace najdete v tématu Zrušení.

is_canceling

Informuje volajícího, zda je skupina úkolů právě uprostřed zrušení. To nemusí nutně znamenat, že cancel metoda byla volána na structured_task_group objekt (ačkoli to jistě kvalifikuje tuto metodu k vrácení true). Může se jednat o případ, že structured_task_group se objekt spouští v textu a skupina úloh dále v pracovním stromu byla zrušena. V případech, kdy modul runtime může předem určit, že zrušení projde tímto structured_task_group objektem, true se vrátí také.

bool is_canceling();

Návratová hodnota

Označení, zda structured_task_group je objekt uprostřed zrušení (nebo je zaručen krátce).

Poznámky

Další informace najdete v tématu Zrušení.

příkaz Run

Naplánuje úkol na objektu structured_task_group . Volající spravuje životnost objektu task_handle předaného v parametru _Task_handle . Verze, která přebírá parametr _Placement , způsobí, že úloha bude zkreslená vůči spuštění v umístění určeném tímto parametrem.

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

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

Parametry

_Funkce
Typ objektu funkce, který bude vyvolán ke spuštění textu popisovače úkolu.

_Task_handle
Popisovač naplánované práce Všimněte si, že volající zodpovídá za životnost tohoto objektu. Modul runtime bude nadále očekávat, že bude aktivní, dokud wait run_and_wait se tento structured_task_group objekt nebo metoda nevolá.

_Umístění
Odkaz na umístění, kde by se měl provést úkol reprezentovaný parametrem _Task_handle .

Poznámky

Modul runtime vytvoří kopii pracovní funkce, kterou předáte této metodě. Všechny změny stavu, ke kterým dochází v objektu funkce, který předáte této metodě, se nezobrazí ve vaší kopii tohoto objektu funkce.

structured_task_group Pokud se destrukce v důsledku odvíjení zásobníku z výjimky, nemusíte zaručit, že volání bylo provedeno buď pro metodu, nebo run_and_wait pro metoduwait. V tomto případě destruktor odpovídajícím způsobem zruší a počká na dokončení úlohy reprezentované parametrem _Task_handle .

Vyvolá výjimku invalid_multiple_scheduling v případě, že popisovač úkolu zadaný parametrem _Task_handle již byl naplánován na objekt skupiny úloh prostřednictvím run metody a nedošlo k wait žádnému volání metody nebo run_and_wait metody v této skupině úloh.

run_and_wait

Naplánuje úlohu tak, aby byla spuštěna v kontextu volání s pomocí objektu structured_task_group pro plnou podporu zrušení. task_handle Pokud je objekt předán jako parametr run_and_wait, volající je zodpovědný za správu životnosti objektutask_handle. Funkce pak počká, dokud se nedokončí nebo zruší všechna práce na objektu structured_task_group .

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

Parametry

_Funkce
Typ objektu funkce, který bude vyvolán ke spuštění úkolu.

_Task_handle
Popisovač úlohy, která se spustí na řádku v kontextu volání. Všimněte si, že volající zodpovídá za životnost tohoto objektu. Modul runtime bude nadále očekávat, že bude aktivní, dokud run_and_wait metoda nedokončí provádění.

_Func
Funkce, která bude volána k vyvolání těla práce. Může se jednat o lambda nebo jiný objekt, který podporuje verzi operátoru volání funkce s podpisem void operator()().

Návratová hodnota

Označení, jestli bylo čekání splněné nebo jestli byla skupina úloh zrušena, a to buď kvůli explicitní operaci zrušení, nebo výjimce z některého z jejích úkolů. Další informace najdete v tématu task_group_status

Poznámky

Všimněte si, že jeden nebo více úkolů naplánovaných na tento structured_task_group objekt může být spuštěno v kontextu volání.

Pokud jeden nebo více úkolů naplánovaných pro tento structured_task_group objekt vyvolá výjimku, modul runtime vybere jednu takovou výjimku z výběru a rozšíří ji mimo volání metody run_and_wait .

Po vrácení structured_task_group této funkce se objekt považuje za konečný a neměl by být použit. Všimněte si, že využití po run_and_wait vrácení metody způsobí nedefinované chování.

V nevýznamné cestě provádění máte mandát volat buď tuto metodu, nebo metodu wait před destruktorem structured_task_group spuštění.

structured_task_group

Vytvoří nový structured_task_group objekt.

structured_task_group();

structured_task_group(cancellation_token _CancellationToken);

Parametry

_CancellationToken
Token zrušení, který se má přidružit k této strukturované skupině úloh. Při zrušení tokenu se zruší strukturovaná skupina úloh.

Poznámky

Konstruktor, který přebírá token zrušení, vytvoří structured_task_group , který bude zrušen při zrušení zdroje přidruženého k tokenu. Poskytnutí explicitního zrušení tokenu také izoluje tuto strukturovanou skupinu úloh od účasti implicitního zrušení z nadřazené skupiny s jiným tokenem nebo bez tokenu.

~structured_task_group

structured_task_group Zničí objekt. Očekává se, wait že zavoláte objekt nebo run_and_wait metodu před spuštěním destruktoru, pokud se destruktor nespouštějí v důsledku odvíjení zásobníku kvůli výjimce.

~structured_task_group();

Poznámky

Pokud se destruktor spustí jako výsledek normálního spuštění (například bez odvíjení zásobníku kvůli výjimce) a wait run_and_wait ani metody nebyly volány, destruktor může vyvolat výjimku missing_wait .

wait

Čeká, až se všechna práce na structured_task_group dokončení nebo zrušení zruší.

task_group_status wait();

Návratová hodnota

Označení, jestli bylo čekání splněné nebo jestli byla skupina úloh zrušena, a to buď kvůli explicitní operaci zrušení, nebo výjimce z některého z jejích úkolů. Další informace najdete v tématu task_group_status

Poznámky

Všimněte si, že jeden nebo více úkolů naplánovaných na tento structured_task_group objekt může být spuštěno v kontextu volání.

Pokud jeden nebo více úkolů naplánovaných pro tento structured_task_group objekt vyvolá výjimku, modul runtime vybere jednu takovou výjimku z výběru a rozšíří ji mimo volání metody wait .

Po vrácení structured_task_group této funkce se objekt považuje za konečný a neměl by být použit. Všimněte si, že využití po wait vrácení metody způsobí nedefinované chování.

V nevýznamné cestě provádění máte mandát volat buď tuto metodu, nebo metodu run_and_wait před destruktorem structured_task_group spuštění.

Viz také

concurrency – obor názvů
task_group – třída
task_handle – třída