Share via


Struttura IThreadProxy

Astrazione per un thread di esecuzione. A seconda della chiave di criteri SchedulerType dell'utilità di pianificazione che si crea, Gestione risorse concederà un proxy del thread appoggiato da un thread Win32 normale o un thread UMS in modalità utente. I thread UMS sono supportati su sistemi operativi a 64 bit con Windows versione 7 e successive.

Sintassi

struct IThreadProxy;

Membri

Metodi pubblici

Nome Descrizione
IThreadProxy::GetId Restituisce un identificatore univoco per il proxy del thread.
IThreadProxy::SwitchOut Rimuove l'associazione tra il contesto e la radice del processore virtuale sottostante.
IThreadProxy::SwitchTo Esegue un cambio di contesto cooperativo dal contesto attualmente in esecuzione a uno diverso.
IThreadProxy::YieldToSystem Determina che il thread chiamante ceda l'esecuzione a un altro thread pronto per l'esecuzione sul processore corrente. Il sistema operativo seleziona il thread successivo da eseguire.

Osservazioni:

I proxy di thread sono associati ai contesti di esecuzione rappresentati dall'interfaccia IExecutionContext come mezzo per l'invio del lavoro.

Gerarchia di ereditarietà

IThreadProxy

Requisiti

Intestazione: concrtrm.h

Spazio dei nomi: Concurrency

Metodo IThreadProxy::GetId

Restituisce un identificatore univoco per il proxy del thread.

virtual unsigned int GetId() const = 0;

Valore restituito

Identificatore integer univoco.

Metodo IThreadProxy::SwitchOut

Rimuove l'associazione tra il contesto e la radice del processore virtuale sottostante.

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

Parametri

switchState
Indica lo stato del proxy del thread che esegue l'opzione. Il parametro è di tipo SwitchingProxyState.

Osservazioni:

Utilizzare SwitchOut se è necessario rimuovere, per qualsiasi motivo, l'associazione tra un contesto e la radice del processore virtuale in cui è in esecuzione. A seconda del valore passato al parametro switchState e dell'eventuale esecuzione in una radice del processore virtuale, tramite la chiamata il proxy thread associato al contesto verrà restituito immediatamente o bloccato. È errato chiamare SwitchOut con il parametro impostato su Idle. In questo modo verrà generata un'eccezione invalid_argument .

SwitchOut è utile quando si desidera ridurre il numero di radici del processore virtuale presenti nell'utilità di pianificazione, poiché richiesto da Gestione risorse oppure perché è stata richiesta una radice del processore virtuale temporaneamente in condizione di oversubscription, ma adesso non è più necessaria. In questo caso è necessario richiamare il metodo IVirtualProcessorRoot::Remove nella radice del processore virtuale, prima di effettuare una chiamata a SwitchOut con il parametro switchState impostato su Blocking. In questo modo il proxy thread verrà bloccato e l'esecuzione verrà ripresa quando una radice del processore virtuale diversa nell'utilità di pianificazione è disponibile per eseguirlo. Il proxy del thread di blocco può essere ripreso chiamando la funzione SwitchTo per passare al contesto di esecuzione del proxy del thread. È anche possibile riprendere il proxy del thread usando il contesto associato per attivare una radice del processore virtuale. Per altre informazioni su come eseguire questa operazione, vedere IVirtualProcessorRoot::Activate.

SwitchOut può essere utilizzato anche quando si desidera reinizializzare il processore virtuale in modo che possa essere attivato in futuro mentre si sta bloccando il proxy thread o lo si sta temporaneamente scollegando dalla radice del processore virtuale in cui è in esecuzione e tramite l'utilità di pianificazione viene inviato il lavoro. Utilizzare SwitchOut con il parametro switchState impostato su Blocking se si desidera bloccare il proxy thread. Può essere ripreso successivamente tramite SwitchTo o IVirtualProcessorRoot::Activate come indicato in precedenza. Utilizzare SwitchOut con il parametro impostato su Nesting quando si desidera scollegare temporaneamente questo proxy thread dalla radice del processore virtuale in cui è in esecuzione e dall'utilità di pianificazione a cui il processore virtuale è associato. Se si chiama SwitchOut con il parametro switchState impostato su Nesting durante l'esecuzione in una radice del processore virtuale, la radice verrà reinizializzata e l'esecuzione del proxy thread corrente continuerà senza bisogno della radice. Il proxy del thread viene considerato di aver lasciato l'utilità di pianificazione fino a quando non chiama il metodo IThreadProxy::SwitchOut con Blocking in un secondo momento. La seconda chiamata a SwitchOut con il parametro impostato su Blocking è progettata per restituire il contesto in uno stato bloccato in modo che possa essere ripreso da SwitchTo o IVirtualProcessorRoot::Activate nell'utilità di pianificazione da cui è stato scollegato. Poiché non era in esecuzione in una radice del processore virtuale, non viene eseguita alcuna reinizializzazione.

Una radice del processore virtuale reinizializzata non è diversa da una radice del processore virtuale nuova concessa all'utilità di pianificazione da Gestione Risorse. È possibile utilizzarla per l'esecuzione attivandola con un contesto di esecuzione utilizzando IVirtualProcessorRoot::Activate.

SwitchOut deve essere chiamato sull'interfaccia IThreadProxy che rappresenta il thread attualmente in esecuzione o i risultati non sono definiti.

Nelle librerie e nelle intestazioni fornite con Visual Studio 2010, questo metodo non accettava un parametro e non consentiva la reinizializzazione della radice del processore virtuale. Per mantenere il comportamento precedente, viene fornito il valore del parametro predefinito di Blocking.

Metodo IThreadProxy::SwitchTo

Esegue un cambio di contesto cooperativo dal contesto attualmente in esecuzione a uno diverso.

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

Parametri

pContext
Contesto di esecuzione a cui passare in modo cooperativo.

switchState
Indica lo stato del proxy del thread che esegue l'opzione. Il parametro è di tipo SwitchingProxyState.

Osservazioni:

Usare questo metodo per passare da un contesto di esecuzione a un altro, dal metodo IExecutionContext::D ispatch del primo contesto di esecuzione. Il metodo associa il contesto pContext di esecuzione a un proxy di thread, se non è già associato a uno. La proprietà del proxy del thread corrente è determinata dal valore specificato per l'argomento switchState .

Usare il valore Idle quando si vuole restituire il proxy thread attualmente in esecuzione a Resource Manager. La chiamata SwitchTo con il parametro switchState impostato su Idle causerà l'avvio dell'esecuzione del contesto pContext di esecuzione nella risorsa di esecuzione sottostante. La proprietà di questo proxy di thread viene trasferita a Resource Manager e si prevede che venga restituita dal metodo del contesto di Dispatch esecuzione subito dopo SwitchTo il completamento del trasferimento. Il contesto di esecuzione inviato dal proxy del thread viene disassociato dal proxy del thread e l'utilità di pianificazione è libera di riutilizzarla o eliminarla in base alle esigenze.

Usare il valore Blocking quando si vuole che questo proxy di thread immetta uno stato bloccato. La chiamata SwitchTo con il parametro switchState impostato su Blocking causerà l'avvio dell'esecuzione del contesto pContext di esecuzione e bloccherà il proxy del thread corrente fino a quando non viene ripreso. L'utilità di pianificazione mantiene la proprietà del proxy del thread quando il proxy del thread si trova nello Blocking stato . Il proxy del thread di blocco può essere ripreso chiamando la funzione SwitchTo per passare al contesto di esecuzione del proxy del thread. È anche possibile riprendere il proxy del thread usando il contesto associato per attivare una radice del processore virtuale. Per altre informazioni su come eseguire questa operazione, vedere IVirtualProcessorRoot::Activate.

Usare il valore Nesting quando si vuole scollegare temporaneamente questo proxy di thread dalla radice del processore virtuale in cui è in esecuzione e l'utilità di pianificazione per cui sta eseguendo il processo. La chiamata SwitchTo con il parametro switchState impostato su Nesting causerà l'avvio dell'esecuzione del contesto pContext di esecuzione e il proxy del thread corrente continua anche l'esecuzione senza la necessità di una radice del processore virtuale. Il proxy del thread viene considerato di aver lasciato l'utilità di pianificazione fino a quando non chiama il metodo IThreadProxy::SwitchOut in un secondo momento. Il IThreadProxy::SwitchOut metodo potrebbe bloccare il proxy del thread fino a quando non è disponibile una radice del processore virtuale per riprogrammarla.

SwitchTo deve essere chiamato sull'interfaccia IThreadProxy che rappresenta il thread attualmente in esecuzione o i risultati non sono definiti. La funzione genera invalid_argument se il parametro pContext è impostato su NULL.

Metodo IThreadProxy::YieldToSystem

Determina che il thread chiamante ceda l'esecuzione a un altro thread pronto per l'esecuzione sul processore corrente. Il sistema operativo seleziona il thread successivo da eseguire.

virtual void YieldToSystem() = 0;

Osservazioni:

Quando viene chiamato da un proxy di thread supportato da un normale thread di Windows, YieldToSystem si comporta esattamente come la funzione SwitchToThreaddi Windows . Tuttavia, quando viene chiamato da thread pianificabili in modalità utente (UMS), la SwitchToThread funzione delega l'attività di selezione del thread successivo da eseguire all'utilità di pianificazione della modalità utente, non al sistema operativo. Per ottenere l'effetto desiderato del passaggio a un thread pronto diverso nel sistema, usare YieldToSystem.

YieldToSystem deve essere chiamato sull'interfaccia IThreadProxy che rappresenta il thread attualmente in esecuzione o i risultati non sono definiti.

Vedi anche

Spazio dei nomi concurrency
Struttura IExecutionContext
Struttura IScheduler
Struttura IVirtualProcessorRoot