Condividi tramite


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