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 SwitchToThread
di 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