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à
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.