Sdílet prostřednictvím


Instance plánovače

Tento dokument popisuje roli instancí plánovače v modulu Concurrency Runtime a použití souběžnosti::Scheduler a souběžnosti::CurrentScheduler třídy k vytváření a správě instancí plánovače. Instance plánovače jsou užitečné, když chcete přidružit explicitní zásady plánování ke konkrétním typům úloh. Můžete například vytvořit jednu instanci plánovače, která spustí některé úlohy s vyšší prioritou vlákna a použije výchozí plánovač ke spouštění dalších úloh v normální prioritě vlákna.

Tip

Concurrency Runtime poskytuje výchozí plánovač, a proto ho v aplikaci nemusíte vytvářet. Vzhledem k tomu, že plánovač úloh pomáhá vyladit výkon vašich aplikací, doporučujeme začít knihovnou PPL (Parallel Patterns Library) nebo knihovnou asynchronních agentů , pokud s modulem Concurrency Runtime začínáte.

Oddíly

Třídy Scheduler a CurrentScheduler

Plánovač úloh umožňuje aplikacím plánovat práci pomocí jedné nebo více instancí plánovače . Concurrency::Scheduler třída představuje instanci plánovače a zapouzdřuje funkce, které souvisí s úkoly plánování.

Vlákno připojené k plánovači se označuje jako kontext spuštění nebo jen kontext. V aktuálním kontextu může být kdykoli aktivní jeden plánovač. Aktivní plánovač se také označuje jako aktuální plánovač. Modul Concurrency Runtime používá třídu concurrency::CurrentScheduler k poskytnutí přístupu k aktuálnímu plánovači. Aktuální plánovač pro jeden kontext se může lišit od aktuálního plánovače pro jiný kontext. Modul runtime neposkytuje reprezentaci aktuálního plánovače na úrovni procesu.

CurrentScheduler Třída se obvykle používá pro přístup k aktuálnímu plánovači. Třída Scheduler je užitečná, když potřebujete spravovat plánovač, který není aktuální.

Následující části popisují, jak vytvořit a spravovat instanci plánovače. Úplný příklad, který znázorňuje tyto úlohy, najdete v tématu Postupy: Správa instance plánovače.

[Nahoře]

Vytvoření instance plánovače

Objekt můžete vytvořit Scheduler třemi způsoby:

  • Pokud žádný plánovač neexistuje, modul runtime pro vás vytvoří výchozí plánovač, když k provádění práce použijete funkce modulu runtime, například paralelní algoritmus. Výchozí plánovač se stane aktuálním plánovačem kontextu, který iniciuje paralelní práci.

  • Metoda concurrency::CurrentScheduler::Create vytvoří Scheduler objekt, který používá konkrétní zásadu a přidruží tento plánovač k aktuálnímu kontextu.

  • Metoda concurrency::Scheduler::Create vytvoří Scheduler objekt, který používá konkrétní zásadu, ale nepřidruží ji k aktuálnímu kontextu.

Povolením modulu runtime vytvořit výchozí plánovač umožňuje všem souběžným úlohám sdílet stejný plánovač. Funkce poskytované knihovnou PPL (Parallel Patterns Library ) nebo asynchronní knihovnou agentů se obvykle používají k provádění paralelní práce. Proto nemusíte pracovat přímo s plánovačem, abyste mohli řídit své zásady nebo životnost. Pokud používáte PPL nebo knihovnu agentů, modul runtime vytvoří výchozí plánovač, pokud neexistuje, a vytvoří ho aktuálním plánovačem pro každý kontext. Když vytvoříte plánovač a nastavíte ho jako aktuální plánovač, modul runtime použije tento plánovač k plánování úloh. Vytvořte další instance plánovače pouze v případě, že potřebujete konkrétní zásadu plánování. Další informace ozásadách

[Nahoře]

Správa doby života instance plánovače

Modul runtime používá mechanismus počítání odkazů k řízení životnosti Scheduler objektů.

Pokud použijete metodu CurrentScheduler::Create nebo metodu Scheduler::Create k vytvoření objektu Scheduler , modul runtime nastaví počáteční referenční počet tohoto plánovače na jeden. Modul runtime zvýší počet odkazů při volání metody concurrency::Scheduler::Attach . Metoda Scheduler::Attach přidruží Scheduler objekt k aktuálnímu kontextu. Díky tomu se jedná o aktuální plánovač. Při volání CurrentScheduler::Create metody modul runtime vytvoří Scheduler objekt a připojí ho k aktuálnímu kontextu (a nastaví počet odkazů na jeden). Ke zvýšení počtu Scheduler odkazů objektu můžete také použít metodu concurrency::Scheduler::Reference.

Modul runtime sníží počet odkazů při volání concurrency::CurrentScheduler::D etach metoda odpojit aktuální plánovač nebo volat concurrency::Scheduler::Release metoda. Když počet odkazů dosáhne nuly, modul runtime po dokončení všech plánovaných úkolů zničí Scheduler objekt. Spuštěný úkol může zvýšit počet odkazů aktuálního plánovače. Proto pokud počet odkazů dosáhne nuly a úkol zvýší počet odkazů, modul runtime nezničí Scheduler objekt, dokud počet odkazů znovu nedosáhne nuly a všechny úkoly se dokončí.

Modul runtime udržuje vnitřní zásobník Scheduler objektů pro každý kontext. Při volání Scheduler::Attach nebo CurrentScheduler::Create metody modul runtime nasdílí tento Scheduler objekt do zásobníku pro aktuální kontext. Díky tomu se jedná o aktuální plánovač. Při volání CurrentScheduler::Detachmodul runtime zobrazí aktuální plánovač ze zásobníku pro aktuální kontext a nastaví předchozí plánovač jako aktuální plánovač.

Modul runtime poskytuje několik způsobů správy životnosti instance plánovače. Následující tabulka ukazuje příslušnou metodu, která uvolní nebo odpojí plánovač od aktuálního kontextu pro každou metodu, která vytvoří nebo připojí plánovač k aktuálnímu kontextu.

Vytvoření nebo připojení metody Metoda uvolnění nebo odpojení
CurrentScheduler::Create CurrentScheduler::Detach
Scheduler::Create Scheduler::Release
Scheduler::Attach CurrentScheduler::Detach
Scheduler::Reference Scheduler::Release

Volání nevhodné metody uvolnění nebo odpojení způsobí v modulu runtime nezadané chování.

Pokud používáte funkce, například PPL, které způsobí, že modul runtime vytvoří výchozí plánovač pro vás, nevyvoláte nebo odpojte tento plánovač. Modul runtime spravuje životnost libovolného plánovače, který vytvoří.

Vzhledem k tomu, že modul runtime neničí Scheduler objekt před dokončením všech úkolů, můžete použít metodu concurrency::Scheduler::RegisterShutdownEvent nebo metodu concurrency::CurrentScheduler::RegisterShutdownEvent k přijetí oznámení při Scheduler zničení objektu. To je užitečné, když musíte počkat na každý úkol, který je naplánován Scheduler objektem dokončit.

[Nahoře]

Metody a funkce

Tato část shrnuje důležité metody CurrentScheduler a Scheduler třídy.

CurrentScheduler Třídu si můžete představit jako pomocníka pro vytvoření plánovače pro použití v aktuálním kontextu. Třída Scheduler umožňuje řídit plánovač, který patří do jiného kontextu.

Následující tabulka ukazuje důležité metody definované CurrentScheduler třídou.

metoda Popis
Vytvořit Vytvoří objekt, který používá zadanou Scheduler zásadu a přidruží ho k aktuálnímu kontextu.
Získat Načte ukazatel na Scheduler objekt přidružený k aktuálnímu kontextu. Tato metoda nezvýšuje počet odkazů objektu Scheduler .
Detach Odpojte aktuální plánovač od aktuálního kontextu a nastaví předchozí plánovač jako aktuální plánovač.
RegisterShutdownEvent Zaregistruje událost, kterou modul runtime nastaví při zničení aktuálního plánovače.
CreateScheduleGroup Vytvoří objekt concurrency::ScheduleGroup v aktuálním plánovači.
ScheduleTask Přidá zjednodušenou úlohu do plánovací fronty aktuálního plánovače.
GetPolicy Načte kopii zásady přidružené k aktuálnímu plánovači.

Následující tabulka ukazuje důležité metody definované Scheduler třídou.

metoda Popis
Vytvořit Vytvoří objekt, který používá zadanou Scheduler zásadu.
Attach Přidruží Scheduler objekt k aktuálnímu kontextu.
Odkaz Zvýší referenční čítač objektu Scheduler .
Vydaná verze Dekrementuje referenční čítač objektu Scheduler .
RegisterShutdownEvent Zaregistruje událost, kterou modul runtime nastaví při zničení objektu Scheduler .
CreateScheduleGroup Vytvoří objekt concurrency::ScheduleGroup v objektuScheduler.
ScheduleTask Naplánuje od objektu Scheduler odlehčený úkol.
GetPolicy Načte kopii zásady, která je přidružená k objektu Scheduler .
SetDefaultSchedulerPolicy Nastaví zásadu pro modul runtime, který se použije při vytváření výchozího plánovače.
ResetDefaultSchedulerPolicy Obnoví výchozí zásadu na zásadu, která byla aktivní před voláním SetDefaultSchedulerPolicy. Pokud se po tomto volání vytvoří výchozí plánovač, modul runtime použije výchozí nastavení zásad k vytvoření plánovače.

[Nahoře]

Příklad

Základní příklady vytvoření a správy instance plánovače najdete v tématu Postupy: Správa instance plánovače.

Viz také

Plánovač úloh
Postupy: Správa instance plánovače
Zásady plánovače
Skupiny plánů