Condividi tramite


Struttura IThreadProxy

Astrazione per un thread di esecuzione. A seconda della chiave di criteri SchedulerType del piano di pianificazione che si crea, il Gestore Risorse concederà un proxy del thread supportato da un thread Win32 regolare o da un thread UMS a livello 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 univoco intero.

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 lo switch. 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 del fatto che venga eseguito su una radice del processore virtuale, la chiamata restituirà immediatamente il proxy del thread associato al contesto o lo bloccherà. È 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 di processori virtuali del proprio schedulatore, sia perché richiesto da Gestione risorse sia perché è stata richiesta una radice di processore virtuale temporaneamente sovraccaricata e 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 un altro core virtuale del scheduler è 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 blocca il proxy del thread o lo si disconnette temporaneamente dal root del processore virtuale su cui è in esecuzione e dal pianificatore per cui sta assegnando 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. Chiamare SwitchOut con il parametro switchState impostato su Nesting durante l'esecuzione su una radice del processore virtuale farà sì che la radice venga reinizializzata e che il proxy del thread corrente continui l'esecuzione senza bisogno di uno nuovo. Il proxy del thread si considera che abbia lasciato lo scheduler finché non chiama il metodo IThreadProxy::SwitchOut con Blocking in un secondo momento. La seconda chiamata a SwitchOut con il parametro impostato su Blocking è pensata per riportare il contesto a uno stato bloccato, in modo che possa essere ripreso da SwitchTo o IVirtualProcessorRoot::Activate nel pianificatore 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 nuova radice del processore virtuale assegnata al pianificatore dal Gestore delle 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 lo switch. 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 al Resource Manager, e ci si aspetta che si ritorni dal metodo del contesto di esecuzione Dispatch subito dopo che SwitchTo restituisce, per completare il trasferimento. Il contesto di esecuzione che il proxy del thread stava gestendo viene disassociato dal proxy del thread, e il scheduler è libero di riutilizzarlo o eliminarlo come ritiene opportuno.

Usare il valore Blocking quando si vuole che questo proxy di thread entri in 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 esso si trova nello stato Blocking. 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 staccare temporaneamente questo proxy di thread dal processore virtuale di base su cui è in esecuzione e dallo scheduler per cui sta eseguendo il lavoro. 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 è considerato come se avesse lasciato il pianificatore fino a quando non viene chiamato 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 concorrenza
Struttura IExecutionContext
Struttura IScheduler
Struttura IVirtualProcessorRoot