Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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