Share via


Struttura IVirtualProcessorRoot

Un'astrazione per un thread hardware sulla quale un proxy del thread può eseguire.

Sintassi

struct IVirtualProcessorRoot : public IExecutionResource;

Membri

Metodi pubblici

Nome Descrizione
IVirtualProcessorRoot::Activate Determina l'avvio dell'esecuzione del proxy del thread associato all'interfaccia pContext del contesto di esecuzione in questa radice del processore virtuale.
IVirtualProcessorRoot::D eactivate Fa sì che il proxy del thread attualmente in esecuzione in questa radice del processore virtuale interrompa l'invio del contesto di esecuzione. Il proxy del thread riprenderà l'esecuzione in una chiamata al Activate metodo .
IVirtualProcessorRoot::EnsureAllTasksVisible Fa sì che i dati archiviati nella gerarchia di memoria dei singoli processori diventino visibili a tutti i processori del sistema. Garantisce che un recinto di memoria completa sia stato eseguito su tutti i processori prima che il metodo restituisca.
IVirtualProcessorRoot::GetId Restituisce un identificatore univoco per la radice del processore virtuale.

Osservazioni:

Ogni radice del processore virtuale ha una risorsa di esecuzione associata. L'interfaccia IVirtualProcessorRoot eredita dall'interfaccia IExecutionResource . Più radici del processore virtuale possono corrispondere allo stesso thread hardware sottostante.

Resource Manager concede radici del processore virtuale alle utilità di pianificazione in risposta alle richieste di risorse. Un'utilità di pianificazione può usare una radice del processore virtuale per eseguire il lavoro attivandolo con un contesto di esecuzione.

Gerarchia di ereditarietà

IExecutionResource

IVirtualProcessorRoot

Requisiti

Intestazione: concrtrm.h

Spazio dei nomi: Concurrency

Metodo IVirtualProcessorRoot::Activate

Determina l'avvio dell'esecuzione del proxy del thread associato all'interfaccia pContext del contesto di esecuzione in questa radice del processore virtuale.

virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;

Parametri

pContext
Interfaccia per il contesto di esecuzione che verrà inviato in questa radice del processore virtuale.

Osservazioni:

Resource Manager fornirà un proxy di thread se non è associato all'interfaccia del contesto di esecuzione pContext

Il Activate metodo può essere usato per avviare l'esecuzione del lavoro su una nuova radice del processore virtuale restituita da Resource Manager o per riprendere il proxy del thread in una radice del processore virtuale disattivata o sta per disattivare. Per altre informazioni sulla disattivazione, vedere IVirtualProcessorRoot::D eactivate . Quando si riprende una radice del processore virtuale disattivata, il parametro pContext deve corrispondere al parametro usato per disattivare la radice del processore virtuale.

Una volta che una radice del processore virtuale è stata attivata per la prima volta, le coppie successive di chiamate a Deactivate e Activate possono correre tra loro. Ciò significa che è accettabile che Resource Manager riceva una chiamata a Activate prima che riceva la Deactivate chiamata per cui è stato progettato.

Quando si attiva una radice del processore virtuale, si segnala a Resource Manager che questa radice del processore virtuale è attualmente occupata dal lavoro. Se l'utilità di pianificazione non riesce a trovare alcun lavoro da eseguire in questa radice, è previsto richiamare il Deactivate metodo che informa resource manager che la radice del processore virtuale è inattiva. Resource Manager usa questi dati per bilanciare il carico del sistema.

invalid_argument viene generata se l'argomento pContext ha il valore NULL.

invalid_operation viene generata se l'argomento pContext non rappresenta il contesto di esecuzione inviato più di recente da questa radice del processore virtuale.

L'azione di attivazione di una radice del processore virtuale aumenta il livello di sottoscrizione del thread hardware sottostante di uno. Per altre informazioni sui livelli di sottoscrizione, vedere IExecutionResource::CurrentSubscriptionLevel.

Metodo IVirtualProcessorRoot::D eactivate

Fa sì che il proxy del thread attualmente in esecuzione in questa radice del processore virtuale interrompa l'invio del contesto di esecuzione. Il proxy del thread riprenderà l'esecuzione in una chiamata al Activate metodo .

virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;

Parametri

pContext
Contesto attualmente inviato da questa radice.

Valore restituito

Un valore booleano. Un valore indica true che il proxy del thread restituito dal Deactivate metodo in risposta a una chiamata al Activate metodo . Un valore indica false che il proxy del thread restituito dal metodo in risposta a un evento di notifica in Resource Manager. In un'utilità di pianificazione thread in modalità utente (UMS), ciò indica che gli elementi sono stati visualizzati nell'elenco di completamento dell'utilità di pianificazione e l'utilità di pianificazione è necessaria per gestirli.

Osservazioni:

Usare questo metodo per interrompere temporaneamente l'esecuzione di una radice del processore virtuale quando non è possibile trovare alcun lavoro nell'utilità di pianificazione. Una chiamata al Deactivate metodo deve provenire dall'interno del Dispatch metodo del contesto di esecuzione con cui la radice del processore virtuale è stata attivata per l'ultima volta. In altre parole, il proxy del thread che richiama il Deactivate metodo deve essere quello attualmente in esecuzione nella radice del processore virtuale. La chiamata del metodo su una radice del processore virtuale in cui non si esegue potrebbe comportare un comportamento non definito.

Una radice del processore virtuale disattivata può essere riattivata con una chiamata al Activate metodo , con lo stesso argomento passato al Deactivate metodo . L'utilità di pianificazione è responsabile di garantire che le chiamate ai Activate metodi e Deactivate siano abbinate, ma non devono essere ricevute in un ordine specifico. Resource Manager può gestire la ricezione di una chiamata al Activate metodo prima di ricevere una chiamata al metodo per cui Deactivate è stato progettato.

Se una radice del processore virtuale si risveglia e il valore restituito dal Deactivate metodo è il valore false, l'utilità di pianificazione deve eseguire una query sull'elenco di completamento UMS tramite il IUMSCompletionList::GetUnblockNotifications metodo , agire su tali informazioni e quindi chiamare di nuovo il Deactivate metodo . Questa operazione deve essere ripetuta fino a quando il Deactivate metodo restituisce il valore true.

invalid_argument viene generata se l'argomento pContext ha il valore NULL.

invalid_operation viene generata se la radice del processore virtuale non è mai stata attivata o l'argomento pContext non rappresenta il contesto di esecuzione inviato più di recente da questa radice del processore virtuale.

L'azione di disattivazione di una radice del processore virtuale riduce il livello di sottoscrizione del thread hardware sottostante di uno. Per altre informazioni sui livelli di sottoscrizione, vedere IExecutionResource::CurrentSubscriptionLevel.

Metodo IVirtualProcessorRoot::EnsureAllTasksVisible

Fa sì che i dati archiviati nella gerarchia di memoria dei singoli processori diventino visibili a tutti i processori del sistema. Garantisce che un recinto di memoria completa sia stato eseguito su tutti i processori prima che il metodo restituisca.

virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;

Parametri

pContext
Contesto attualmente inviato da questa radice del processore virtuale.

Osservazioni:

Questo metodo può risultare utile quando si vuole sincronizzare la disattivazione di una radice del processore virtuale con l'aggiunta di un nuovo lavoro nell'utilità di pianificazione. Per motivi di prestazioni, è possibile decidere di aggiungere elementi di lavoro all'utilità di pianificazione senza eseguire una barriera di memoria, il che significa che gli elementi di lavoro aggiunti da un thread in esecuzione su un processore non sono immediatamente visibili a tutti gli altri processori. Usando questo metodo insieme al Deactivate metodo è possibile assicurarsi che l'utilità di pianificazione non disattiva tutte le radici del processore virtuale mentre gli elementi di lavoro esistono nelle raccolte dell'utilità di pianificazione.

Una chiamata al EnsureAllTasksVisibleThe metodo deve provenire dall'interno del Dispatch metodo del contesto di esecuzione con cui la radice del processore virtuale è stata attivata per l'ultima volta. In altre parole, il proxy del thread che richiama il EnsureAllTasksVisible metodo deve essere quello attualmente in esecuzione nella radice del processore virtuale. La chiamata del metodo su una radice del processore virtuale in cui non si esegue potrebbe comportare un comportamento non definito.

invalid_argument viene generata se l'argomento pContext ha il valore NULL.

invalid_operation viene generata se la radice del processore virtuale non è mai stata attivata o l'argomento pContext non rappresenta il contesto di esecuzione inviato più di recente da questa radice del processore virtuale.

Metodo IVirtualProcessorRoot::GetId

Restituisce un identificatore univoco per la radice del processore virtuale.

virtual unsigned int GetId() const = 0;

Valore restituito

Identificatore integer.

Vedi anche

Spazio dei nomi concurrency