Share via


Contextklasse

Vertegenwoordigt een abstractie voor een uitvoeringscontext.

Syntaxis

class Context;

Leden

Beveiligde constructors

Naam Description
~Contextdestructor

Openbare methoden

Naam Description
blokkeren Hiermee blokkeert u de huidige context.
CurrentContext Retourneert een aanwijzer naar de huidige context.
GetId Retourneert een id voor de context die uniek is binnen de scheduler waartoe de context behoort.
GetScheduleGroupId Retourneert een identificator voor de planningsgroep waaraan de context momenteel werkt.
GetVirtualProcessorId Retourneert een id voor de virtuele processor waarop de context momenteel wordt uitgevoerd.
Id Retourneert een id voor de huidige context die uniek is binnen de planner waartoe de huidige context behoort.
IsCurrentTaskCollectionCanceling Retourneert een indicatie of de taakverzameling die momenteel inline wordt uitgevoerd op de huidige context zich midden in een actieve annulering bevindt (of binnenkort).
IsSynchronouslyBlocked Bepaalt of de context al dan niet synchroon wordt geblokkeerd. Een context wordt beschouwd als synchroon geblokkeerd als er expliciet een actie is uitgevoerd die heeft geleid tot blokkering.
Overinschrijven Injecteert een extra virtuele processor in een scheduler voor de duur van een codeblok wanneer deze wordt aangeroepen in een context die wordt uitgevoerd op een van de virtuele processors in die scheduler.
ScheduleGroupId Retourneert een identificatie voor de planningsgroep waarop de huidige context actief is.
Deblokkeren Deblokkeert de context en zorgt ervoor dat deze kan worden uitgevoerd.
VirtualProcessorId Retourneert een id voor de virtuele processor waarop de huidige context wordt uitgevoerd.
Opbrengst Geeft uitvoering vrij zodat een andere context kan worden uitgevoerd. Als er geen andere context beschikbaar is om aan te geven, kan de scheduler naar een andere besturingssysteemthread overschakelen.

Opmerkingen

De Concurrency Runtime scheduler (zie Scheduler) gebruikt uitvoeringscontexten om het werk dat door uw toepassing in de wachtrij is geplaatst, uit te voeren. Een Win32-thread is een voorbeeld van een uitvoeringscontext op een Windows-besturingssysteem.

Op elk gewenst moment is het gelijktijdigheidsniveau van een scheduler gelijk aan het aantal virtuele processors dat eraan wordt verleend door Resource Manager. Een virtuele processor is een abstractie voor een verwerkingsresource en wordt toegewezen aan een hardwarethread op het onderliggende systeem. Slechts één scheduler-context kan op een bepaald moment worden uitgevoerd op een virtuele processor.

De scheduler is coöperatief van aard, en een uitvoeringscontext kan op elk gewenst moment zijn virtuele processor aan een andere context overdragen, als deze naar een wachtstand wil schakelen. Wanneer aan de voorwaarde van de wachttijd is voldaan, kan het niet worden hervat totdat een beschikbare virtuele processor van de scheduler het begint uit te voeren.

Overnamehiërarchie

Context

Requirements

Koptekst: concrt.h

Naamruimte: concurrentie

Block

Hiermee blokkeert u de huidige context.

static void __cdecl Block();

Opmerkingen

Met deze methode wordt de standaardplanner van het proces gemaakt en/of gekoppeld aan de aanroepende context als er momenteel geen scheduler is gekoppeld aan de aanroepende context.

Als de aanroepende context wordt uitgevoerd op een virtuele processor, vindt de virtuele processor een andere uitvoerbare context om uit te voeren of kan er mogelijk een nieuwe worden gemaakt.

Nadat de Block methode is aangeroepen of wordt aangeroepen, moet u deze koppelen met een aanroep naar de methode Deblokkeren vanuit een andere uitvoeringscontext om deze opnieuw uit te voeren. Houd er rekening mee dat er een kritieke periode is tussen het punt waar de code de context publiceert voor een andere thread om de Unblock methode aan te roepen en het punt waar de werkelijke methode-aanroep Block wordt gedaan. Gedurende deze periode mag u geen methode aanroepen die om zijn eigen redenen kan blokkeren en deblokkeren (bijvoorbeeld het verkrijgen van een vergrendeling). Aanroepen naar de Block en Unblock methode houden de reden voor het blokkeren en deblokkeren niet bij. Slechts één object mag eigenaar zijn van een Block- Unblock paar.

Deze methode kan verschillende uitzonderingen genereren, waaronder scheduler_resource_allocation_error.

~Context

virtual ~Context();

HuidigeContext

Retourneert een aanwijzer naar de huidige context.

static Context* __cdecl CurrentContext();

Retourwaarde

Een aanwijzer naar de huidige context.

Opmerkingen

Met deze methode wordt de standaardplanner van het proces gemaakt en/of gekoppeld aan de aanroepende context als er momenteel geen scheduler is gekoppeld aan de aanroepende context.

GetId

Retourneert een id voor de context die uniek is binnen de scheduler waartoe de context behoort.

virtual unsigned int GetId() const = 0;

Retourwaarde

Een id voor de context die uniek is binnen de scheduler waartoe de context behoort.

GetScheduleGroupId

Retourneert een identificator voor de planningsgroep waaraan de context momenteel werkt.

virtual unsigned int GetScheduleGroupId() const = 0;

Retourwaarde

Een id voor de planningsgroep waar de context momenteel aan werkt.

Opmerkingen

De retourwaarde van deze methode is een onmiddellijke momentopname van de planningsgroep waarin de context actief is. Als deze methode wordt aangeroepen voor een andere context dan de huidige context, kan de waarde verlopen zijn op het moment dat deze wordt geretourneerd en kan niet worden vertrouwd. Deze methode wordt doorgaans alleen gebruikt voor foutopsporing of traceringsdoeleinden.

GetVirtualProcessorId

Retourneert een id voor de virtuele processor waarop de context momenteel wordt uitgevoerd.

virtual unsigned int GetVirtualProcessorId() const = 0;

Retourwaarde

Als de context momenteel wordt uitgevoerd op een virtuele processor, een id voor de virtuele processor waarop de context momenteel wordt uitgevoerd; anders is de waarde -1.

Opmerkingen

De retourwaarde van deze methode is een onmiddellijke steekproef van de virtuele processor waarop de context wordt uitgevoerd. Deze waarde kan verlopen zijn op het moment dat deze wordt geretourneerd en kan niet worden vertrouwd. Deze methode wordt doorgaans alleen gebruikt voor foutopsporing of traceringsdoeleinden.

Identiteitsbewijs

Retourneert een id voor de huidige context die uniek is binnen de planner waartoe de huidige context behoort.

static unsigned int __cdecl Id();

Retourwaarde

Als de huidige context is gekoppeld aan een planner, een id voor de huidige context die uniek is binnen de planner waartoe de huidige context behoort; anders is de waarde -1.

IsCurrentTaskCollectionCanceling

Retourneert een indicatie of de taakverzameling die momenteel inline wordt uitgevoerd op de huidige context zich midden in een actieve annulering bevindt (of binnenkort).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Retourwaarde

Als een scheduler is gekoppeld aan de aanroepende context en een taakgroep een inline taak uitvoert in die context, wordt aangegeven of die taakgroep zich midden in een actieve annulering bevindt (of dat binnenkort zal zijn); anders is de waarde false.

IsSynchroonGeblokkeerd

Bepaalt of de context al dan niet synchroon wordt geblokkeerd. Een context wordt beschouwd als synchroon geblokkeerd als er expliciet een actie is uitgevoerd die heeft geleid tot blokkering.

virtual bool IsSynchronouslyBlocked() const = 0;

Retourwaarde

Of de context synchroon wordt geblokkeerd.

Opmerkingen

Een context wordt beschouwd als synchroon geblokkeerd als er expliciet een actie is uitgevoerd die heeft geleid tot blokkering. In de thread scheduler zou dit duiden op een directe aanroep naar de Context::Block methode of een synchronisatieobject dat is gebouwd met behulp van de Context::Block methode.

De retourwaarde van deze methode is een onmiddellijk voorbeeld van of de context synchroon wordt geblokkeerd. Deze waarde kan verlopen zijn op het moment dat deze wordt geretourneerd en kan alleen worden gebruikt onder zeer specifieke omstandigheden.

operator verwijderen

Een Context object wordt intern vernietigd door de runtime. Het kan niet expliciet worden verwijderd.

void operator delete(void* _PObject);

Parameterwaarden

_PObject
Een aanwijzer naar het object dat moet worden verwijderd.

Oversubscriberen

Injecteert een extra virtuele processor in een scheduler voor de duur van een codeblok wanneer deze wordt aangeroepen in een context die wordt uitgevoerd op een van de virtuele processors in die scheduler.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Parameterwaarden

_BeginOversubscription
Als true, wordt aangegeven dat een extra virtuele processor moet worden toegevoegd gedurende de oversubscriptie. Als false, een indicatie dat de oversubscriptie moet eindigen en de eerder toegevoegde virtuele processor moet worden verwijderd.

SchemaGroepId

Retourneert een identificatie voor de planningsgroep waarop de huidige context actief is.

static unsigned int __cdecl ScheduleGroupId();

Retourwaarde

Als de huidige context is gekoppeld aan een scheduler en aan een planningsgroep werkt, is er een id voor de scheduler-groep waaraan de huidige context werkt; anders is de waarde -1.

Deblokkeren

Deblokkeert de context en zorgt ervoor dat deze kan worden uitgevoerd.

virtual void Unblock() = 0;

Opmerkingen

Het is volledig legaal voor een aanroep naar de Unblock-methode om vóór een bijbehorende aanroep van de Block-methode te komen. Zolang aanroepen naar de Block en Unblock methoden correct zijn gekoppeld, verwerkt de runtime de natuurlijke race van beide volgordes. Een Unblock oproep die plaatsvindt voordat een Block oproep, neutraliseert gewoon het effect van de Block oproep.

Er zijn verschillende uitzonderingen die kunnen worden gegenereerd op basis van deze methode. Als een context de Unblock methode op zichzelf probeert aan te roepen, wordt er een context_self_unblock uitzondering gegenereerd. Als aanroepen naar Block en Unblock niet goed zijn gekoppeld (bijvoorbeeld twee aanroepen Unblock die worden gedaan voor een context die momenteel wordt uitgevoerd), wordt er een context_unblock_unbalanced uitzondering gegenereerd.

Houd er rekening mee dat er een kritieke periode is tussen het punt waar de code de context publiceert voor een andere thread om de Unblock methode aan te roepen en het punt waar de werkelijke methode-aanroep Block wordt gedaan. Gedurende deze periode mag u geen methode aanroepen die om zijn eigen redenen kan blokkeren en deblokkeren (bijvoorbeeld het verkrijgen van een vergrendeling). Aanroepen naar de Block en Unblock methode houden de reden voor het blokkeren en deblokkeren niet bij. Slechts één object mag eigenaar zijn van een Block en Unblock paar.

VirtualProcessorId

Retourneert een id voor de virtuele processor waarop de huidige context wordt uitgevoerd.

static unsigned int __cdecl VirtualProcessorId();

Retourwaarde

Als de huidige context is gekoppeld aan een planner, een id voor de virtuele processor waarop de huidige context wordt uitgevoerd; anders is de waarde -1.

Opmerkingen

De retourwaarde van deze methode is een onmiddellijke steekproef van de virtuele processor waarop de huidige context wordt uitgevoerd. Deze waarde kan verlopen zijn op het moment dat deze wordt geretourneerd en kan niet worden vertrouwd. Deze methode wordt doorgaans alleen gebruikt voor foutopsporing of traceringsdoeleinden.

Opbrengst

Levert de uitvoering op, zodat een andere context kan worden uitgevoerd. Als er geen andere context beschikbaar is om voorrang aan te geven, kan de scheduler overgaan naar een andere thread van het besturingssysteem.

static void __cdecl Yield();

Opmerkingen

Met deze methode wordt de standaardplanner van het proces gemaakt en/of gekoppeld aan de aanroepende context als er momenteel geen scheduler is gekoppeld aan de aanroepende context.

YieldExecution

Geeft uitvoering vrij zodat een andere context kan worden uitgevoerd. Als er geen andere context beschikbaar is om aan te geven, kan de scheduler naar een andere besturingssysteemthread overschakelen.

static void __cdecl YieldExecution();

Opmerkingen

Met deze methode wordt de standaardplanner van het proces gemaakt en/of gekoppeld aan de aanroepende context als er momenteel geen scheduler is gekoppeld aan de aanroepende context.

Deze functie is nieuw in Visual Studio 2015 en is identiek aan de functie Rendement , maar conflicteert niet met de macro Opbrengst in Windows.h.

Zie ook

concurrentie Namespace
Scheduler-klasse
Taakplanner