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::Detach
modul 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ů