Classe Context
Rappresenta un'astrazione per un contesto di esecuzione.
Sintassi
class Context;
Membri
Costruttori protetti
Nome | Descrizione |
---|---|
Distruttore ~Context |
Metodi pubblici
Nome | Descrizione |
---|---|
Blocco | Blocca il contesto corrente. |
CurrentContext | Restituisce un puntatore al contesto corrente. |
GetId | Restituisce un identificatore per il contesto univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto. |
GetScheduleGroupId | Restituisce un identificatore per il gruppo di pianificazione su cui sta lavorando il contesto. |
GetVirtualProcessorId | Restituisce un identificatore per il processore virtuale su cui è in esecuzione il contesto. |
Id | Restituisce un identificatore per il contesto corrente univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto corrente. |
IsCurrentTaskCollectionCanceling | Restituisce un'indicazione del fatto che la raccolta di attività attualmente in esecuzione inline nel contesto corrente si trova nel mezzo di un annullamento attivo (o sarà a breve). |
IsSynchronouslyBlocked | Determina se il contesto è bloccato in modo sincrono. Un contesto viene considerato bloccato in modo sincrono se ha eseguito in modo esplicito un'azione che ha portato al blocco. |
Sovrascrivere | Inserisce un processore virtuale aggiuntivo in un'utilità di pianificazione per la durata di un blocco di codice quando viene richiamato su un contesto in esecuzione su uno dei processori virtuali in tale utilità di pianificazione. |
ScheduleGroupId | Restituisce un identificatore per il gruppo di pianificazione su cui sta lavorando il contesto corrente. |
Sbloccare | Sblocca il contesto e lo fa diventare eseguibile. |
VirtualProcessorId | Restituisce un identificatore per il processore virtuale su cui è in esecuzione il contesto corrente. |
Rendimento | Restituisce l'esecuzione in modo da poter eseguire un altro contesto. Se non è disponibile un altro contesto a cui cedere l'esecuzione, l'utilità di pianificazione può cedere l'esecuzione a un altro thread del sistema operativo. |
Osservazioni:
L'utilità di pianificazione del runtime di concorrenza (vedere Utilità di pianificazione) usa i contesti di esecuzione per eseguire il lavoro accodato dall'applicazione. Un thread Win32 è un esempio di contesto di esecuzione in un sistema operativo Windows.
In qualsiasi momento, il livello di concorrenza di un'utilità di pianificazione è uguale al numero di processori virtuali concessi da Resource Manager. Un processore virtuale è un'astrazione per una risorsa di elaborazione ed esegue il mapping a un thread hardware nel sistema sottostante. Solo un singolo contesto dell'utilità di pianificazione può essere eseguito in un processore virtuale in un determinato momento.
L'utilità di pianificazione è collaborativa in natura e un contesto di esecuzione può restituire il processore virtuale a un contesto diverso in qualsiasi momento se vuole entrare in uno stato di attesa. Quando attende che sia soddisfatto, non può riprendere fino a quando un processore virtuale disponibile dall'utilità di pianificazione non inizia a eseguirlo.
Gerarchia di ereditarietà
Context
Requisiti
Intestazione: concrt.h
Spazio dei nomi: Concurrency
Blocco
Blocca il contesto corrente.
static void __cdecl Block();
Osservazioni:
Tale metodo determinerà la creazione dell'utilità di pianificazione predefinita del processo e/o il collegamento al contesto di chiamata se non è presente alcuna utilità di pianificazione attualmente associata al contesto di chiamata.
Se il contesto chiamante è in esecuzione in un processore virtuale, il processore virtuale troverà un altro contesto eseguibile da eseguire o potrebbe crearne uno nuovo.
Dopo che il Block
metodo è stato chiamato o verrà chiamato, è necessario associarlo a una chiamata al metodo Unblock da un altro contesto di esecuzione per poterlo eseguire di nuovo. Tenere presente che è presente un periodo critico tra il punto in cui il codice pubblica il relativo contesto per un altro thread per poter chiamare il Unblock
metodo e il punto in cui viene effettuata la chiamata effettiva al Block
metodo. Durante questo periodo, non deve essere chiamare alcun metodo che può a sua volta bloccarsi e sbloccarsi per motivi propri (ad esempio acquisendo un blocco). Le chiamate al Block
metodo e Unblock
non tengono traccia del motivo del blocco e dello sblocco. Un solo oggetto deve avere la proprietà di una Block
- Unblock
coppia.
Questo metodo può generare un'ampia gamma di eccezioni, tra cui scheduler_resource_allocation_error.
~Contesto
virtual ~Context();
CurrentContext
Restituisce un puntatore al contesto corrente.
static Context* __cdecl CurrentContext();
Valore restituito
Puntatore al contesto corrente.
Osservazioni:
Tale metodo determinerà la creazione dell'utilità di pianificazione predefinita del processo e/o il collegamento al contesto di chiamata se non è presente alcuna utilità di pianificazione attualmente associata al contesto di chiamata.
GetId
Restituisce un identificatore per il contesto univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto.
virtual unsigned int GetId() const = 0;
Valore restituito
Identificatore per il contesto univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto.
GetScheduleGroupId
Restituisce un identificatore per il gruppo di pianificazione su cui sta lavorando il contesto.
virtual unsigned int GetScheduleGroupId() const = 0;
Valore restituito
Identificatore del gruppo di pianificazione su cui è in corso il contesto.
Osservazioni:
Il valore restituito da questo metodo è un campionamento istantaneo del gruppo di pianificazione su cui è in esecuzione il contesto. Se questo metodo viene chiamato in un contesto diverso da quello corrente, è possibile che il valore non sia aggiornato nel momento in cui viene restituito e potrebbe non essere affidabile. In genere, questo metodo viene usato solo a scopo di debug o traccia.
GetVirtualProcessorId
Restituisce un identificatore per il processore virtuale su cui è in esecuzione il contesto.
virtual unsigned int GetVirtualProcessorId() const = 0;
Valore restituito
Se il contesto è attualmente in esecuzione in un processore virtuale, un identificatore per il processore virtuale in cui è attualmente in esecuzione il contesto; in caso contrario, il valore -1
.
Osservazioni:
Il valore restituito da questo metodo è un campionamento istantaneo del processore virtuale su cui è in esecuzione il contesto. Questo valore può essere non aggiornato nel momento in cui viene restituito e non può essere ritenuto affidabile. In genere, questo metodo viene usato solo a scopo di debug o traccia.
ID.
Restituisce un identificatore per il contesto corrente univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto corrente.
static unsigned int __cdecl Id();
Valore restituito
Se il contesto corrente è collegato a un'utilità di pianificazione, un identificatore per il contesto corrente univoco all'interno dell'utilità di pianificazione a cui appartiene il contesto corrente; in caso contrario, il valore -1
.
IsCurrentTaskCollectionCanceling
Restituisce un'indicazione del fatto che la raccolta di attività attualmente in esecuzione inline nel contesto corrente si trova nel mezzo di un annullamento attivo (o sarà a breve).
static bool __cdecl IsCurrentTaskCollectionCanceling();
Valore restituito
Se un'utilità di pianificazione è collegata al contesto chiamante e un gruppo di attività esegue un'attività inline su tale contesto, un'indicazione del fatto che il gruppo di attività si trova in mezzo a un annullamento attivo (o sarà a breve); in caso contrario, il valore false
.
IsSynchronouslyBlocked
Determina se il contesto è bloccato in modo sincrono. Un contesto viene considerato bloccato in modo sincrono se ha eseguito in modo esplicito un'azione che ha portato al blocco.
virtual bool IsSynchronouslyBlocked() const = 0;
Valore restituito
Indica se il contesto è bloccato in modo sincrono.
Osservazioni:
Un contesto viene considerato bloccato in modo sincrono se ha eseguito in modo esplicito un'azione che ha portato al blocco. Nell'utilità di pianificazione del thread, questo indicherebbe una chiamata diretta al metodo Context::Block
o un oggetto di sincronizzazione compilato utilizzando il metodo Context::Block
.
Il valore restituito da questo metodo è un esempio istantaneo di blocco sincrono del contesto. Questo valore può essere obsoleto al momento in cui viene restituito e può essere usato solo in circostanze molto specifiche.
operator delete
Un Context
oggetto viene eliminato internamente dal runtime. Non è possibile eliminarlo in modo esplicito.
void operator delete(void* _PObject);
Parametri
_PObject
Puntatore all'oggetto da eliminare.
Sovrascrivere
Inserisce un processore virtuale aggiuntivo in un'utilità di pianificazione per la durata di un blocco di codice quando viene richiamato su un contesto in esecuzione su uno dei processori virtuali in tale utilità di pianificazione.
static void __cdecl Oversubscribe(bool _BeginOversubscription);
Parametri
_BeginOversubscription
Se true
, è necessario aggiungere un processore virtuale aggiuntivo per la durata dell'oversubscription. Se false
, indica che l'oversubscription deve terminare e che il processore virtuale aggiunto in precedenza deve essere rimosso.
ScheduleGroupId
Restituisce un identificatore per il gruppo di pianificazione su cui sta lavorando il contesto corrente.
static unsigned int __cdecl ScheduleGroupId();
Valore restituito
Se il contesto corrente è collegato a un'utilità di pianificazione e lavora su un gruppo di pianificazione, un identificatore per il gruppo dell'utilità di pianificazione su cui sta lavorando il contesto corrente; in caso contrario, il valore -1
.
Sblocca
Sblocca il contesto e lo fa diventare eseguibile.
virtual void Unblock() = 0;
Osservazioni:
È perfettamente legale per una chiamata al Unblock
metodo prima di una chiamata corrispondente al metodo Block . Se le chiamate ai Block
metodi e Unblock
vengono abbinate correttamente, il runtime gestisce correttamente la razza naturale di entrambi gli ordini. Una Unblock
chiamata in arrivo prima di una Block
chiamata nega semplicemente l'effetto della Block
chiamata.
Esistono diverse eccezioni che possono essere generate da questo metodo. Se un contesto tenta di chiamare il Unblock
metodo stesso, verrà generata un'eccezione context_self_unblock . Se le chiamate a Block
e Unblock
non sono abbinate correttamente (ad esempio, due chiamate a Unblock
vengono effettuate per un contesto attualmente in esecuzione), verrà generata un'eccezione context_unblock_unbalanced .
Tenere presente che è presente un periodo critico tra il punto in cui il codice pubblica il relativo contesto per un altro thread per poter chiamare il Unblock
metodo e il punto in cui viene effettuata la chiamata effettiva al Block
metodo. Durante questo periodo, non deve essere chiamare alcun metodo che può a sua volta bloccarsi e sbloccarsi per motivi propri (ad esempio acquisendo un blocco). Le chiamate al Block
metodo e Unblock
non tengono traccia del motivo del blocco e dello sblocco. Un solo oggetto deve avere la proprietà di una Block
coppia e Unblock
.
VirtualProcessorId
Restituisce un identificatore per il processore virtuale su cui è in esecuzione il contesto corrente.
static unsigned int __cdecl VirtualProcessorId();
Valore restituito
Se il contesto corrente è collegato a un'utilità di pianificazione, un identificatore per il processore virtuale su cui è in esecuzione il contesto corrente; in caso contrario, il valore -1
.
Osservazioni:
Il valore restituito da questo metodo è un campionamento istantaneo del processore virtuale su cui è in esecuzione il contesto corrente. Questo valore può essere non aggiornato nel momento in cui viene restituito e non può essere ritenuto affidabile. In genere, questo metodo viene usato solo a scopo di debug o traccia.
Rendimento
Restituisce l'esecuzione in modo da poter eseguire un altro contesto. Se non è disponibile un altro contesto a cui cedere l'esecuzione, l'utilità di pianificazione può cedere l'esecuzione a un altro thread del sistema operativo.
static void __cdecl Yield();
Osservazioni:
Tale metodo determinerà la creazione dell'utilità di pianificazione predefinita del processo e/o il collegamento al contesto di chiamata se non è presente alcuna utilità di pianificazione attualmente associata al contesto di chiamata.
YieldExecution
Restituisce l'esecuzione in modo da poter eseguire un altro contesto. Se non è disponibile un altro contesto a cui cedere l'esecuzione, l'utilità di pianificazione può cedere l'esecuzione a un altro thread del sistema operativo.
static void __cdecl YieldExecution();
Osservazioni:
Tale metodo determinerà la creazione dell'utilità di pianificazione predefinita del processo e/o il collegamento al contesto di chiamata se non è presente alcuna utilità di pianificazione attualmente associata al contesto di chiamata.
Questa funzione è una novità di Visual Studio 2015 ed è identica alla funzione Yield , ma non è in conflitto con la macro Yield in Windows.h.
Vedi anche
Spazio dei nomi concurrency
Classe Scheduler
Utilità di pianificazione