Context – třída
Představuje abstrakci kontextu spuštění.
Syntaxe
class Context;
Členové
Chráněné konstruktory
Název | Popis |
---|---|
~Destruktor kontextu |
Veřejné metody
Název | Popis |
---|---|
Blok | Zablokuje aktuální kontext. |
CurrentContext | Vrátí ukazatel na aktuální kontext. |
GetId | Vrátí identifikátor kontextu, který je jedinečný v rámci plánovače, do kterého kontext patří. |
GetScheduleGroupId | Vrátí identifikátor pro skupinu plánů, na které právě pracuje kontext. |
GetVirtualProcessorId | Vrátí identifikátor virtuálního procesoru, na který se právě spouští kontext. |
Id | Vrátí identifikátor aktuálního kontextu, který je jedinečný v rámci plánovače, do kterého aktuální kontext patří. |
IsCurrentTaskCollectionCanceling | Vrátí informaci o tom, jestli je kolekce úloh, která se právě spouští v aktuálním kontextu, uprostřed aktivního zrušení (nebo brzy). |
IsSynchronouslyBlocked | Určuje, zda je kontext synchronně blokovaný. Kontext se považuje za synchronně blokovaný, pokud explicitně provedl akci, která vedla k blokování. |
Přepsání | Vloží další virtuální procesor do plánovače po dobu trvání bloku kódu při vyvolání kontextu spuštěného na jednom z virtuálních procesorů v tomto plánovači. |
ScheduleGroupId | Vrátí identifikátor pro skupinu plánů, na které pracuje aktuální kontext. |
Odblokovat | Odblokuje kontext a způsobí jeho spuštění. |
VirtualProcessorId | Vrátí identifikátor virtuálního procesoru, na který se spouští aktuální kontext. |
Výnos | Poskytuje provádění tak, aby se mohl spustit jiný kontext. Pokud není k dispozici žádný jiný kontext, který by mohl přinést, může plánovač získat jiný vlákno operačního systému. |
Poznámky
Plánovač Concurrency Runtime (viz Scheduler) používá kontexty spouštění ke spuštění práce ve frontě vaší aplikace. Vlákno Win32 je příkladem kontextu spuštění v operačním systému Windows.
Úroveň souběžnosti plánovače se kdykoli rovná počtu virtuálních procesorů udělených Resource Managerem. Virtuální procesor je abstrakce pro prostředek zpracování a mapuje se na hardwarové vlákno v podkladovém systému. V daném okamžiku se na virtuálním procesoru může spustit pouze jeden kontext plánovače.
Plánovač je v přírodě spolupracující a prováděcí kontext může kdykoliv přinést svůj virtuální procesor do jiného kontextu, pokud chce vstoupit do stavu čekání. Jakmile je jeho čekání splněno, nemůže pokračovat, dokud není spuštěný dostupný virtuální procesor z plánovače.
Hierarchie dědičnosti
Context
Požadavky
Hlavička: concrt.h
Namespace: souběžnost
Blok
Zablokuje aktuální kontext.
static void __cdecl Block();
Poznámky
Tato metoda způsobí, že se vytvoří výchozí plánovač procesu nebo připojí k kontextu volání, pokud není k kontextu volání aktuálně přidružený žádný plánovač.
Pokud je volající kontext spuštěný na virtuálním procesoru, virtuální procesor najde jiný spustitelný kontext, který se má spustit, nebo může potenciálně vytvořit nový.
Block
Po volání metody nebo bude volána, musíte ji spárovat s voláním Odblokovat metodu z jiného kontextu spuštění, aby se znovu spustil. Mějte na paměti, že mezi bodem, ve kterém kód publikuje svůj kontext pro jiné vlákno, aby bylo možné volat metodu Unblock
a bod, ve kterém je provedeno skutečné volání Block
metody. Během tohoto období nesmíte volat žádnou metodu, která může blokovat a odblokovat z vlastních důvodů (například získání zámku). Volání metody Block
a Unblock
nesledují důvod blokování a odblokování. Pouze jeden objekt by měl mít vlastnictví páru Block
- Unblock
.
Tato metoda může vyvolat řadu výjimek, včetně scheduler_resource_allocation_error.
~Kontext
virtual ~Context();
CurrentContext
Vrátí ukazatel na aktuální kontext.
static Context* __cdecl CurrentContext();
Návratová hodnota
Ukazatel na aktuální kontext.
Poznámky
Tato metoda způsobí, že se vytvoří výchozí plánovač procesu nebo připojí k kontextu volání, pokud není k kontextu volání aktuálně přidružený žádný plánovač.
GetId
Vrátí identifikátor kontextu, který je jedinečný v rámci plánovače, do kterého kontext patří.
virtual unsigned int GetId() const = 0;
Návratová hodnota
Identifikátor kontextu, který je jedinečný v rámci plánovače, do kterého kontext patří.
GetScheduleGroupId
Vrátí identifikátor pro skupinu plánů, na které právě pracuje kontext.
virtual unsigned int GetScheduleGroupId() const = 0;
Návratová hodnota
Identifikátor skupiny plánů, na které právě pracuje kontext.
Poznámky
Návratová hodnota z této metody je okamžité vzorkování skupiny plánů, na které se kontext spouští. Pokud je tato metoda volána na jiný kontext než aktuální kontext, může být hodnota zastaralá v okamžiku, kdy je vrácena a nelze ji spoléhat. Tato metoda se obvykle používá pouze pro účely ladění nebo trasování.
GetVirtualProcessorId
Vrátí identifikátor virtuálního procesoru, na který se právě spouští kontext.
virtual unsigned int GetVirtualProcessorId() const = 0;
Návratová hodnota
Pokud se kontext aktuálně spouští na virtuálním procesoru, identifikátor virtuálního procesoru, pro který se kontext aktuálně spouští; jinak hodnota -1
.
Poznámky
Návratová hodnota z této metody je okamžité vzorkování virtuálního procesoru, na který se kontext spouští. Tato hodnota může být zastaralá v okamžiku, kdy se vrátí a nelze ji spoléhat. Tato metoda se obvykle používá pouze pro účely ladění nebo trasování.
ID
Vrátí identifikátor aktuálního kontextu, který je jedinečný v rámci plánovače, do kterého aktuální kontext patří.
static unsigned int __cdecl Id();
Návratová hodnota
Pokud je aktuální kontext připojen k plánovači, identifikátor aktuálního kontextu, který je jedinečný v rámci plánovače, ke kterému aktuální kontext patří; jinak hodnota -1
.
IsCurrentTaskCollectionCanceling
Vrátí informaci o tom, jestli je kolekce úloh, která se právě spouští v aktuálním kontextu, uprostřed aktivního zrušení (nebo brzy).
static bool __cdecl IsCurrentTaskCollectionCanceling();
Návratová hodnota
Pokud je plánovač připojený k volajícímu kontextu a skupina úkolů provádí úkol v tomto kontextu, indikuje, zda je tato skupina úkolů uprostřed aktivního zrušení (nebo brzy); jinak hodnota false
.
IsSynchronouslyBlocked
Určuje, zda je kontext synchronně blokovaný. Kontext se považuje za synchronně blokovaný, pokud explicitně provedl akci, která vedla k blokování.
virtual bool IsSynchronouslyBlocked() const = 0;
Návratová hodnota
Určuje, jestli je kontext synchronně blokovaný.
Poznámky
Kontext se považuje za synchronně blokovaný, pokud explicitně provedl akci, která vedla k blokování. V plánovači vláken by to značilo přímé volání Context::Block
metody nebo objekt synchronizace, který byl vytvořen pomocí Context::Block
metody.
Návratová hodnota z této metody je okamžitá ukázka toho, jestli je kontext synchronně blokovaný. Tato hodnota může být zastaralá v okamžiku, kdy je vrácena, a lze ji použít pouze za velmi specifických okolností.
delete – operátor
Context
Objekt je vnitřně zničen modulem runtime. Nelze jej explicitně odstranit.
void operator delete(void* _PObject);
Parametry
_PObject
Ukazatel na objekt, který se má odstranit.
Přepsání
Vloží další virtuální procesor do plánovače po dobu trvání bloku kódu při vyvolání kontextu spuštěného na jednom z virtuálních procesorů v tomto plánovači.
static void __cdecl Oversubscribe(bool _BeginOversubscription);
Parametry
_BeginOversubscription
Pokud true
by se po dobu nadsoučtu měla přidat další virtuální procesor. Pokud false
by mělo dojít k tomu, že by se měl ukončit přesazení a dříve přidaný virtuální procesor by se měl odebrat.
ScheduleGroupId
Vrátí identifikátor pro skupinu plánů, na které pracuje aktuální kontext.
static unsigned int __cdecl ScheduleGroupId();
Návratová hodnota
Pokud je aktuální kontext připojen k plánovači a pracuje na skupině plánů, identifikátor skupiny plánovače, na které aktuální kontext pracuje; jinak hodnota -1
.
Zrušit blokování
Odblokuje kontext a způsobí jeho spuštění.
virtual void Unblock() = 0;
Poznámky
Je naprosto legální, aby volání Unblock
metody přišlo před odpovídajícím voláním metody Block . Pokud jsou volání Block
a Unblock
metody správně spárované, modul runtime správně zpracovává přirozenou rasu řazení. Volání Unblock
přicházející před voláním Block
jednoduše neguje účinek Block
volání.
Existuje několik výjimek, které mohou být vyvolány z této metody. Pokud se kontext pokusí volat metodu Unblock
sama o sobě, vyvolá se context_self_unblock výjimka. Pokud se volání Block
Unblock
správně spárují (například dvě volání Unblock
se pro kontext, který je právě spuštěný), vyvolá se výjimka context_unblock_unbalanced .
Mějte na paměti, že mezi bodem, ve kterém kód publikuje svůj kontext pro jiné vlákno, aby bylo možné volat metodu Unblock
a bod, ve kterém je provedeno skutečné volání Block
metody. Během tohoto období nesmíte volat žádnou metodu, která může blokovat a odblokovat z vlastních důvodů (například získání zámku). Volání metody Block
a Unblock
nesledují důvod blokování a odblokování. Vlastnictví a Unblock
páru Block
by měl mít pouze jeden objekt.
VirtualProcessorId
Vrátí identifikátor virtuálního procesoru, na který se spouští aktuální kontext.
static unsigned int __cdecl VirtualProcessorId();
Návratová hodnota
Pokud je aktuální kontext připojen k plánovači, identifikátor virtuálního procesoru, na který se aktuální kontext spouští; jinak hodnota -1
.
Poznámky
Návratová hodnota z této metody je okamžité vzorkování virtuálního procesoru, na které se spouští aktuální kontext. Tato hodnota může být zastaralá v okamžiku, kdy se vrátí a nelze ji spoléhat. Tato metoda se obvykle používá pouze pro účely ladění nebo trasování.
Výnos
Poskytuje provádění tak, aby se mohl spustit jiný kontext. Pokud není k dispozici žádný jiný kontext, který by mohl přinést, může plánovač získat jiný vlákno operačního systému.
static void __cdecl Yield();
Poznámky
Tato metoda způsobí, že se vytvoří výchozí plánovač procesu nebo připojí k kontextu volání, pokud není k kontextu volání aktuálně přidružený žádný plánovač.
YieldExecution
Poskytuje provádění tak, aby se mohl spustit jiný kontext. Pokud není k dispozici žádný jiný kontext, který by mohl přinést, může plánovač získat jiný vlákno operačního systému.
static void __cdecl YieldExecution();
Poznámky
Tato metoda způsobí, že se vytvoří výchozí plánovač procesu nebo připojí k kontextu volání, pokud není k kontextu volání aktuálně přidružený žádný plánovač.
Tato funkce je v sadě Visual Studio 2015 nová a je shodná s funkcí Yield , ale není v konfliktu s makrem Yield ve Windows.h.