Sdílet prostřednictvím


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 trueby se po dobu nadsoučtu měla přidat další virtuální procesor. Pokud falseby 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.

Viz také

concurrency – obor názvů
Scheduler – třída
Plánovač úloh