Condividi tramite


Classe Context

Rappresenta un'astrazione per un contesto di esecuzione.

Sintassi

class Context;

Membri

Costruttori protetti

Nome Descrizione
~Distruttore di Context

Metodi pubblici

Nome Descrizione
Blocco Blocca il contesto corrente.
CurrentContext Restituisce un puntatore al contesto corrente.
GetId Restituisce un identificatore per il contesto che è univoco all'interno dello scheduler 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 univoco per il contesto corrente all'interno dello schedulatore a cui appartiene.
VerificaCancellazioneAttivitàCorrente Restituisce un'indicazione del fatto che l'insieme di attività attualmente in esecuzione in linea nel contesto corrente è in corso di un annullamento in corso (o lo sarà a breve).
IsSynchronouslyBlocked Determina se il contesto è bloccato in modo sincrono o meno. 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 di esecuzione a cui cedere, il scheduler può cedere a un altro thread del sistema operativo.

Osservazioni:

Lo scheduler del runtime di concorrenza (vedere Scheduler) utilizza 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 a esso 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 del pianificatore può essere eseguito su un processore virtuale in un dato momento.

Il pianificatore è cooperativa in natura e un contesto di esecuzione può cedere il proprio processore virtuale a un contesto diverso in qualsiasi momento se desidera entrare in uno stato di attesa. Quando l'attesa è soddisfatta, non può riprendere fino a quando un processore virtuale disponibile dal gestore 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 si deve chiamare alcun metodo che può a sua volta bloccarsi e sbloccarsi per ragioni proprie (ad esempio, acquisire 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 che è univoco all'interno dello scheduler a cui appartiene il contesto.

virtual unsigned int GetId() const = 0;

Valore restituito

Identificatore univoco per il contesto all'interno dello schedulatore 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 il contesto sta attualmente lavorando.

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 univoco per il contesto corrente all'interno dello schedulatore a cui appartiene.

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 l'insieme di attività attualmente in esecuzione in linea nel contesto corrente è in corso di un annullamento in corso (o lo sarà a breve).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Valore restituito

Se un programmatore è collegato al contesto chiamante e un gruppo di attività esegue un'attività inlinea su tale contesto, viene indicato se il gruppo di attività si trova in mezzo a un annullamento attivo (o lo sarà a breve); in caso contrario, il valore false.

IsSynchronouslyBlocked

Determina se il contesto è bloccato o meno in modo sincronizzato. 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 che una chiamata al metodo Unblock preceda una chiamata corrispondente al metodo Block. Se le chiamate ai metodi Block e Unblock vengono abbinate correttamente, il runtime gestisce correttamente la condizione di competizione 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 sollevate da questo metodo. Se un contesto tenta di chiamare su se stesso il metodo Unblock, 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 si deve chiamare alcun metodo che può a sua volta bloccarsi e sbloccarsi per ragioni proprie (ad esempio, acquisire 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 coppia Block 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 di esecuzione a cui cedere, il scheduler può cedere 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.

InterrompiEsecuzione

Restituisce l'esecuzione in modo da poter eseguire un altro contesto. Se non è disponibile un altro contesto di esecuzione a cui cedere, il scheduler può cedere 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 concorrenza
Classe Pianificatore
Utilità di pianificazione