Sdílet prostřednictvím


Kontexty

Tento dokument popisuje roli kontextů v souběžném běhu.Podproces, který je připojen k Plánovač je označován jako kontextu spuštění, nebo pouze kontextu.Concurrency::wait funkci a concurrency::Context třídy umožňují řídit chování kontexty.Použití wait funkci po určitou dobu pozastavit aktuální kontext.Použití Context třídy, když potřebujete větší kontrolu nad při kontexty blokovat blokování a výnos nebo pokud chcete aktuální kontext oversubscribe.

Tip

Runtime souběžnost poskytuje výchozí Plánovač, a proto není nutné ji vytvořit v aplikaci.Protože služba Plánovač úloh pomáhá optimalizovat výkon aplikací, doporučujeme spuštění se Knihovna PPL (Parallel Patterns Library) nebo Knihovna asynchronních agentů Pokud runtime souběžnosti.

Funkce čekání

Concurrency::wait funkce ve výnosech spuštění aktuální kontext pro zadaný počet milisekund.Běhový modul používá čas výnos provádět další úlohy.Po uplynutí zadané doby runtime přeplánuje kontext pro spuštění.Proto wait funkce může pozastavit aktuální kontext delší než hodnota stanovená milliseconds parametr.

Předávání 0 (nula) milliseconds parametr způsobí runtime pozastavit aktuální kontext, dokud všechny aktivní kontexty jsou příležitost k práci.To umožňuje výnosu úkolů na jiné aktivní úlohy.

Příklad

Příklad, který používá wait funkce aktuální kontext výnosu a umožnit tak spuštění naleznete v jiných kontextech Postupy: Použití skupin plánů k ovlivnění pořadí provádění.

Třída Context

Concurrency::Context třída poskytuje programovací abstrakce pro kontext provádění a nabízí dvě důležité funkce: schopnost ve blokovat, odblokování a výnos aktuální kontext a schopnost oversubscribe aktuálního kontextu.

Blokování spolupráce

Context Třída umožňuje blokovat nebo výnos aktuálního kontextu spuštění.Blokování nebo získávání je užitečné při aktuální kontext nemůže pokračovat, protože zdroj není k dispozici.

Concurrency::Context::Block metoda blokuje aktuálního kontextu.Kontext, který je blokován výnosů jeho zpracování zdrojů tak, aby modul runtime můžete provádět další úlohy.Concurrency::Context::Unblock metoda odblokuje blokované kontextu.Context::Unblock z kontextu jiného než nazývá musí být volána metoda Context::Block.Vyvolá modul runtime concurrency::context_self_unblock Pokud kontext pokusy o odblokování sám.

Ve blokování a odblokování kontext, obvykle volání concurrency::Context::CurrentContext k získání ukazatele na Context objekt, který je spojen s aktuální podproces a uložit výsledek.Potom volat Context::Block metoda zablokovat v aktuálním kontextu.Zavolat později, Context::Unblock z kontextu samostatné odblokovat zablokovaný kontextu.

Každý pár volání musí odpovídat Context::Block a Context::Unblock.Vyvolá modul runtime concurrency::context_unblock_unbalanced při Context::Block nebo Context::Unblock je volána metoda postupně bez odpovídající volání jiné metody.Však není nutné volat Context::Block než zavoláte Context::Unblock.Například jeden kontext volání Context::Unblock před jiný kontext volání Context::Block této souvislosti zůstává stejné kontextu odblokovány.

Concurrency::Context::Yield metoda předá vykonávání mohou provádět další úlohy a potom přeplánovat kontext pro spuštění modulu runtime.Při volání Context::Block metoda runtime nelze změnit plán kontextu.

Příklad

Příklad, který používá Context::Block, Context::Unblock, a Context::Yield metody pro provádění spolupráce semafor třídy, viz Postupy: Použití třídy kontextu pro implementaci semaforu pro spolupráci.

Podávání

Výchozí Plánovač vytvoří stejný počet podprocesů, které jsou dostupné hardwarové podprocesů.Můžete použít podávání vytvořit další podprocesy pro daný hardware podproces.

Pro výpočetně náročné operace jež obvykle není měřítko protože zavádí další režii.Však pro úkoly, které mají vysoké částky čekací doba, například čtení dat z disku nebo síťové připojení, jež může zlepšit celkové účinnosti některých aplikací.

[!POZNÁMKA]

Povolte podávání pouze z podprocesu, který byl vytvořen Runtime souběžnosti.Při volání z podprocesu, který nebyl vytvořen runtime (včetně hlavní podproces), jež nemá žádný vliv.

Chcete-li povolit podávání v aktuálním kontextu volání concurrency::Context::Oversubscribe metodou s _BeginOversubscription parametr nastaven na hodnotu true.Při povolení zaznamenán v podprocesu, který byl vytvořen v souběžném běhu způsobí runtime vytvořit další jeden podproces.Po všechny úkoly vyžadující zaznamenán dokončit volání Context::Oversubscribe se _BeginOversubscription parametru false.

Můžete povolit podávání několikrát z aktuálního kontextu, ale je nutné jej zakázat stejný počet kolikrát ji povolit.Mohou být také vnořené podávání; úkol, který je vytvořen jiný úkol, který používá zaznamenán, lze oversubscribe jeho kontextu.Však v případě vnořených úkolu a jeho nadřazeným patří do stejného kontextu pouze vnější volání Context::Oversubscribe způsobí vytvoření další podproces.

[!POZNÁMKA]

Vyvolá modul runtime concurrency::invalid_oversubscribe_operation -li zaznamenán zakázána, než je povoleno.

Příklad

Příklad používá zaznamenán vyrovnat zpoždění, která je způsobena čtení dat ze síťového připojení, viz Postupy: Kompenzace latence vytvořením nadbytečného počtu vláken.

Viz také

Úkoly

Postupy: Použití skupin plánů k ovlivnění pořadí provádění

Postupy: Použití třídy kontextu pro implementaci semaforu pro spolupráci

Postupy: Kompenzace latence vytvořením nadbytečného počtu vláken

Koncepty

Plánovač úloh (Concurrency Runtime)