Structuur IThreadProxy

Een abstractie voor een uitvoeringsdraad. Afhankelijk van de SchedulerType beleidsleutel van de planner die u aanmaakt, verleent Resource Manager u een threadproxy die wordt ondersteund door een reguliere Win32-thread of een user-mode schedulable (UMS) thread. UMS-threads worden ondersteund op 64-bits besturingssystemen met versie Windows 7 en hoger.

Syntaxis

struct IThreadProxy;

Leden

Openbare methoden

Naam Description
IThreadProxy::GetId Retourneert een unieke id voor de threadproxy.
IThreadProxy::SwitchOut Koppelt de context los van de onderliggende virtuele processor-root.
IThreadProxy::SwitchTo Hiermee wordt een coöperatieve context overgeschakeld van de huidige uitvoeringscontext naar een andere context.
IThreadProxy::YieldToSystem Hiermee wordt de aanroepende thread uitgevoerd op een andere thread die gereed is voor uitvoering op de huidige processor. Het besturingssysteem selecteert de volgende thread die moet worden uitgevoerd.

Opmerkingen

Threadproxy's worden gekoppeld aan uitvoeringscontexten die door de interface IExecutionContext worden vertegenwoordigd als een middel voor verzending van werk.

Overnamehiërarchie

IThreadProxy

Requirements

Koptekst: concrtrm.h

Naamruimte: concurrentie

Methode IThreadProxy::GetId

Retourneert een unieke id voor de threadproxy.

virtual unsigned int GetId() const = 0;

Retourwaarde

Een unieke integer-identificatie.

Methode IThreadProxy::SwitchOut

Koppelt de context los van de onderliggende wortel van de virtuele processor.

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

Parameterwaarden

switchState
Geeft de status aan van de threadproxy die de switch uitvoert. De parameter is van het type SwitchingProxyState.

Opmerkingen

Gebruik SwitchOut deze opdracht als u om welke reden dan ook een context loskoppelt van de hoofdmap van de virtuele processor waarop deze wordt uitgevoerd. Afhankelijk van de waarde die u aan de parameter switchStatedoorgeeft en of deze al dan niet wordt uitgevoerd op de hoofdmap van een virtuele processor, wordt de aanroep onmiddellijk geretourneerd of wordt de threadproxy geblokkeerd die aan de context is gekoppeld. Het is een fout om SwitchOut aan te roepen met de parameter ingesteld op Idle. Als u dit doet, resulteert dit in een invalid_argument uitzondering.

SwitchOut is handig als u het aantal virtuele processorhoofdmappen wilt verminderen dat uw planner heeft, omdat Resource Manager u heeft geïnstrueerd om dit te doen, of omdat u een tijdelijke oversubscribeerde virtuele processorhoofdmap hebt aangevraagd en ermee klaar bent. In dit geval moet u de methode IVirtualProcessorRoot::Remove op de virtuele processor wortel aanroepen voordat u een aanroep doet met SwitchOut met de parameter ingesteld op Blocking. Hierdoor wordt de threadproxy geblokkeerd en wordt de uitvoering hervat wanneer een andere root van de virtuele processor in de scheduler beschikbaar is om het uit te voeren. De threadproxy die geblokkeerd is kan worden hervat door de functie SwitchTo aan te roepen om over te schakelen naar de uitvoeringscontext van deze threadproxy. U kunt ook een thread-proxy hervatten door de eraan gekoppelde context te gebruiken om een basis van een virtuele processor te activeren. Zie IVirtualProcessorRoot::Activate voor meer informatie over hoe u dit doet.

SwitchOut kan ook worden gebruikt wanneer u de virtuele processor opnieuw wilt initialiseren, zodat deze in de toekomst kan worden geactiveerd, terwijl de thread-proxy wordt geblokkeerd of tijdelijk wordt losgekoppeld van de hoofdeenheid van de virtuele processor waarop het draait, en van de taakplanner waarvoor het de taken dispatcht. Gebruik SwitchOut met de parameter switchState ingesteld op Blocking als u de threadproxy wilt blokkeren. Het kan later worden hervat met behulp van SwitchTo of IVirtualProcessorRoot::Activate zoals hierboven vermeld. Gebruik SwitchOut met de parameterset op Nesting wanneer u deze threadproxy tijdelijk wilt loskoppelen van de virtuele processor-root waarop het draait en de scheduler waarmee de virtuele processor is gekoppeld. Bij het aanroepen van SwitchOut met de parameter switchState ingesteld op Nesting terwijl het wordt uitgevoerd op een virtuele processorroot, zal de root opnieuw worden geïnitialiseerd en zal de huidige threadproxy verder worden uitgevoerd zonder dat er een nieuwe nodig is. De threadproxy wordt geacht de scheduler te hebben verlaten totdat de methode IThreadProxy::SwitchOut op een later moment wordt aangeroepen. De tweede aanroep naar SwitchOut met de parameter ingesteld op Blocking is bedoeld om de context terug te brengen naar een geblokkeerde status, zodat hij kan worden hervat door SwitchTo of IVirtualProcessorRoot::Activate in de scheduler waaruit hij is losgekoppeld. Omdat deze niet werd uitgevoerd op de hoofdmap van een virtuele processor, vindt er geen herinitialisatie plaats.

Een opnieuw geïnitialiseerde root van een virtuele processor verschilt niet van een gloednieuwe virtuale processor root die uw planner van de Resource Manager heeft gekregen. U kunt het gebruiken voor uitvoering door het te activeren met een uitvoeringscontext met behulp van IVirtualProcessorRoot::Activate.

SwitchOut moet worden aangeroepen op de IThreadProxy interface die de momenteel uitgevoerde thread vertegenwoordigt of de resultaten niet zijn gedefinieerd.

In de bibliotheken en headers die zijn geleverd met Visual Studio 2010, nam deze methode geen parameter en initialiseerde de virtuele processorroot niet opnieuw. Als u oud gedrag wilt behouden, wordt de standaardparameterwaarde Blocking opgegeven.

Methode IThreadProxy::SwitchTo

Hiermee wordt een coöperatieve context overgeschakeld van de huidige uitvoeringscontext naar een andere context.

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

Parameterwaarden

pContext
De uitvoeringscontext om op gecoördineerde wijze naar over te schakelen.

switchState
Geeft de status aan van de threadproxy die de switch uitvoert. De parameter is van het type SwitchingProxyState.

Opmerkingen

Gebruik deze methode om over te schakelen van de ene uitvoeringscontext naar de andere, vanuit de IExecutionContext::Dispatch-methode van de eerste uitvoeringscontext. De methode koppelt de uitvoeringscontext pContext aan een threadproxy als deze nog niet aan een proxy is gekoppeld. Het eigendom van de huidige threadproxy wordt bepaald door de waarde die u voor het switchState argument opgeeft.

Gebruik de waarde Idle wanneer u de momenteel uitgevoerde threadproxy wilt retourneren aan Resource Manager. Als SwitchTo wordt aangeroepen met de parameter switchState ingesteld op Idle, zal de uitvoeringscontext pContext beginnen met uitvoeren op de onderliggende uitvoeringsresource. Het eigendom van deze thread-proxy wordt overgedragen aan de Resource Manager, en het is de bedoeling dat u kort nadat Dispatch is teruggekeerd, vanuit de uitvoeringscontext retourneert om de overdracht te voltooien. De uitvoeringscontext die door de threadproxy werd afgehandeld, wordt losgekoppeld van de threadproxy, en de scheduler is vrij om deze opnieuw te gebruiken of te vernietigen zoals het gepast vindt.

Gebruik de waarde Blocking wanneer u wilt dat deze threadproxy een geblokkeerde status invoert. Als SwitchTo wordt aangeroepen met de parameter switchState ingesteld op Blocking, zal de uitvoeringscontext pContext beginnen met uitvoeren en de huidige threadproxy vergrendelen totdat deze opnieuw wordt hervat. De scheduler behoudt het eigendom van de threadproxy wanneer de threadproxy de Blocking status heeft. De threadproxy die geblokkeerd is kan worden hervat door de functie SwitchTo aan te roepen om over te schakelen naar de uitvoeringscontext van deze threadproxy. U kunt ook een thread-proxy hervatten door de eraan gekoppelde context te gebruiken om een basis van een virtuele processor te activeren. Zie IVirtualProcessorRoot::Activate voor meer informatie over hoe u dit doet.

Gebruik de waarde Nesting wanneer u deze thread-proxy tijdelijk wilt loskoppelen van de virtuele processorwortel waarop het wordt uitgevoerd en de planner waarvoor het taken uitvoert. Wanneer u SwitchTo aanroept met de parameter switchState ingesteld op Nesting, zal de uitvoeringscontext pContext beginnen met uitvoeren en zal de huidige threadproxy ook doorgaan met uitvoeren zonder dat hier een virtuele processorroot voor nodig is. De thread proxy wordt geacht de scheduler te hebben verlaten totdat op een later tijdstip de methode IThreadProxy::SwitchOut wordt aangeroepen. De IThreadProxy::SwitchOut-methode kan de thread-proxy blokkeren totdat een wortel van een virtuele processor beschikbaar is om het opnieuw in te plannen.

SwitchTo moet worden aangeroepen op de IThreadProxy interface die de momenteel uitgevoerde thread vertegenwoordigt of de resultaten niet zijn gedefinieerd. De functie genereert invalid_argument als de parameter pContext is ingesteld op NULL.

Methode IThreadProxy::YieldToSystem

Hiermee wordt de aanroepende thread uitgevoerd op een andere thread die gereed is voor uitvoering op de huidige processor. Het besturingssysteem selecteert de volgende thread die moet worden uitgevoerd.

virtual void YieldToSystem() = 0;

Opmerkingen

Wanneer het wordt aangeroepen door een threadproxy die wordt ondersteund door een gewone Windows-thread, YieldToSystem gedraagt zich precies zoals de Windows-functie SwitchToThread. Wanneer de functie echter wordt aangeroepen vanuit UMS-threads (user-mode schedulable), delegeert de SwitchToThread functie de taak van het kiezen van de volgende thread die moet worden uitgevoerd naar de gebruikersmodusplanner, niet het besturingssysteem. Als u het gewenste effect wilt bereiken van het overschakelen naar een andere kant-en-klare thread in het systeem, gebruikt u YieldToSystem.

YieldToSystem moet worden aangeroepen op de IThreadProxy interface die de momenteel uitgevoerde thread vertegenwoordigt of de resultaten niet zijn gedefinieerd.

Zie ook

concurrentie Namespace
IExecutionContext-structuur
IScheduler-structuur
Structuur IVirtualProcessorRoot