Istanze dell'utilità di pianificazione
Questo documento descrive il ruolo delle istanze dell'utilità di pianificazione nel runtime di concorrenza e come usare le classi concurrency::Scheduler e concurrency::CurrentScheduler per creare e gestire istanze dell'utilità di pianificazione. Le istanze dell'utilità di pianificazione sono utili quando si vogliono associare criteri di pianificazione espliciti a tipi specifici di carichi di lavoro. È possibile ad esempio creare un'istanza dell'utilità di pianificazione per eseguire alcune attività con una priorità di thread elevata e usare l'utilità di pianificazione predefinita per eseguire altre attività con una priorità di thread normale.
Suggerimento
Il runtime di concorrenza fornisce un'utilità di pianificazione predefinita, pertanto non è necessario crearne una nell'applicazione. Poiché l'Utilità di pianificazione consente di ottimizzare le prestazioni delle applicazioni, è consigliabile iniziare con la libreria PPL (Parallel Patterns Library) o la libreria degli agenti asincroni se non si ha una novità del runtime di concorrenza.
Sezioni
Classi Scheduler e CurrentScheduler
L'Utilità di pianificazione consente alle applicazioni di usare una o più istanze dell'utilità di pianificazione per pianificare il lavoro. La classe concurrency::Scheduler rappresenta un'istanza dell'utilità di pianificazione e incapsula le funzionalità correlate alle attività di pianificazione.
Un thread collegato a un'utilità di pianificazione è noto come contesto di esecuzione o solo contesto. Un'utilità di pianificazione può essere attiva nel contesto corrente in qualsiasi momento. L'utilità di pianificazione attiva è nota anche come utilità di pianificazione corrente. Il runtime di concorrenza usa la classe concurrency::CurrentScheduler per fornire l'accesso all'utilità di pianificazione corrente. L'utilità di pianificazione corrente per un contesto può essere diversa dall'utilità di pianificazione corrente per un altro contesto. Il runtime non fornisce una rappresentazione a livello di processo dell'utilità di pianificazione corrente.
In genere, la CurrentScheduler
classe viene usata per accedere all'utilità di pianificazione corrente. La Scheduler
classe è utile quando è necessario gestire un'utilità di pianificazione che non è quella corrente.
Le sezioni seguenti descrivono come creare e gestire un'istanza dell'utilità di pianificazione. Per un esempio completo che illustra queste attività, vedere Procedura: Gestire un'istanza dell'utilità di pianificazione.
Creazione di un'istanza dell'utilità di pianificazione
Esistono tre modi per creare un Scheduler
oggetto:
Se non esiste alcuna utilità di pianificazione, il runtime crea automaticamente un'utilità di pianificazione predefinita quando si usano le funzionalità di runtime, ad esempio un algoritmo parallelo, per eseguire il lavoro. L'utilità di pianificazione predefinita diventa l'utilità di pianificazione corrente per il contesto che avvia il lavoro parallelo.
Il metodo concurrency::CurrentScheduler::Create crea un
Scheduler
oggetto che usa criteri specifici e associa tale utilità di pianificazione al contesto corrente.Il metodo concurrency::Scheduler::Create crea un
Scheduler
oggetto che usa criteri specifici, ma non lo associa al contesto corrente.
Consentire al runtime di creare un'utilità di pianificazione predefinita consente a tutte le attività simultanee di condividere lo stesso utilità di pianificazione. In genere, la funzionalità fornita dalla libreria PPL (Parallel Patterns Library ) o dalla libreria degli agenti asincroni viene usata per eseguire operazioni parallele. Pertanto, non è necessario lavorare direttamente con l'utilità di pianificazione per controllarne i criteri o la durata. Quando si usa PPL o la libreria agenti, il runtime crea l'utilità di pianificazione predefinita, se non esiste e lo rende l'utilità di pianificazione corrente per ogni contesto. Quando si crea un'utilità di pianificazione e la si imposta come utilità di pianificazione corrente, il runtime usa tale utilità di pianificazione per pianificare le attività. Creare istanze aggiuntive dell'utilità di pianificazione solo quando è necessario un criterio di pianificazione specifico. Per altre informazioni sui criteri associati a un'utilità di pianificazione, vedere Criteri dell'utilità di pianificazione.
Gestione della durata di un'istanza dell'utilità di pianificazione
Il runtime usa un meccanismo di conteggio dei riferimenti per controllare la durata degli Scheduler
oggetti.
Quando si usa il CurrentScheduler::Create
metodo o il Scheduler::Create
metodo per creare un Scheduler
oggetto, il runtime imposta il conteggio dei riferimenti iniziale dell'utilità di pianificazione su uno. Il runtime incrementa il conteggio dei riferimenti quando si chiama il metodo concurrency::Scheduler::Attach . Il Scheduler::Attach
metodo associa l'oggetto Scheduler
al contesto corrente. In questo modo l'utilità di pianificazione corrente. Quando si chiama il CurrentScheduler::Create
metodo , il runtime crea un Scheduler
oggetto e lo associa al contesto corrente (e imposta il conteggio dei riferimenti su uno). È anche possibile usare il metodo concurrency::Scheduler::Reference per incrementare il numero di riferimenti di un Scheduler
oggetto.
Il runtime decrementa il conteggio dei riferimenti quando si chiama il metodo concurrency::CurrentScheduler::D etach per scollegare l'utilità di pianificazione corrente o chiamare il metodo concurrency::Scheduler::Release . Quando il conteggio dei riferimenti raggiunge zero, il runtime elimina definitivamente l'oggetto Scheduler
al termine di tutte le attività pianificate. Un'attività in esecuzione può incrementare il conteggio dei riferimenti dell'utilità di pianificazione corrente. Pertanto, se il conteggio dei riferimenti raggiunge zero e un'attività incrementa il conteggio dei riferimenti, il runtime non distrugge l'oggetto Scheduler
finché il conteggio dei riferimenti non raggiunge di nuovo zero e tutte le attività terminano.
Il runtime gestisce uno stack interno di Scheduler
oggetti per ogni contesto. Quando si chiama il Scheduler::Attach
metodo o CurrentScheduler::Create
, il runtime esegue il push Scheduler
dell'oggetto nello stack per il contesto corrente. In questo modo l'utilità di pianificazione corrente. Quando si chiama CurrentScheduler::Detach
, il runtime popa l'utilità di pianificazione corrente dallo stack per il contesto corrente e imposta quella precedente come utilità di pianificazione corrente.
Il runtime offre diversi modi per gestire la durata di un'istanza dell'utilità di pianificazione. Nella tabella seguente viene illustrato il metodo appropriato che rilascia o scollega l'utilità di pianificazione dal contesto corrente per ogni metodo che crea o collega un'utilità di pianificazione al contesto corrente.
Creare o collegare il metodo | Rilasciare o scollegare il metodo |
---|---|
CurrentScheduler::Create |
CurrentScheduler::Detach |
Scheduler::Create |
Scheduler::Release |
Scheduler::Attach |
CurrentScheduler::Detach |
Scheduler::Reference |
Scheduler::Release |
La chiamata al metodo di rilascio o scollegamento non appropriato produce un comportamento non specificato nel runtime.
Quando si usano funzionalità, ad esempio, il PPL, che fa sì che il runtime crei automaticamente l'utilità di pianificazione predefinita, non rilasciare o scollegare l'utilità di pianificazione. Il runtime gestisce la durata di qualsiasi utilità di pianificazione creata.
Poiché il runtime non elimina definitivamente un Scheduler
oggetto prima del completamento di tutte le attività, è possibile usare il metodo concurrency::Scheduler::RegisterShutdownEvent o concurrency::CurrentScheduler::RegisterShutdownEvent per ricevere una notifica quando un Scheduler
oggetto viene eliminato definitivamente. Ciò è utile quando è necessario attendere il completamento di ogni attività pianificata da un Scheduler
oggetto .
Metodi e funzionalità
In questa sezione vengono riepilogati i metodi importanti delle CurrentScheduler
classi e Scheduler
.
Si pensi alla CurrentScheduler
classe come helper per la creazione di un'utilità di pianificazione da usare nel contesto corrente. La Scheduler
classe consente di controllare un'utilità di pianificazione appartenente a un altro contesto.
Nella tabella seguente vengono illustrati i metodi importanti definiti dalla CurrentScheduler
classe .
metodo | Descrizione |
---|---|
Crea | Crea un Scheduler oggetto che usa i criteri specificati e lo associa al contesto corrente. |
GET | Recupera un puntatore all'oggetto Scheduler associato al contesto corrente. Questo metodo non incrementa il conteggio dei riferimenti dell'oggetto Scheduler . |
Scollega | Scollega l'utilità di pianificazione corrente dal contesto corrente e imposta quella precedente come utilità di pianificazione corrente. |
RegisterShutdownEvent | Registra un evento impostato dal runtime quando l'utilità di pianificazione corrente viene eliminata definitivamente. |
CreateScheduleGroup | Crea un oggetto concurrency::ScheduleGroup nell'utilità di pianificazione corrente. |
ScheduleTask | Aggiunge un'attività leggera alla coda di pianificazione dell'utilità di pianificazione corrente. |
GetPolicy | Recupera una copia dei criteri associati all'utilità di pianificazione corrente. |
Nella tabella seguente vengono illustrati i metodi importanti definiti dalla Scheduler
classe .
metodo | Descrizione |
---|---|
Crea | Crea un Scheduler oggetto che utilizza i criteri specificati. |
Collega | Associa l'oggetto Scheduler al contesto corrente. |
Riferimento | Incrementa il contatore di riferimento dell'oggetto Scheduler . |
Versione | Decrementa il contatore di riferimento dell'oggetto Scheduler . |
RegisterShutdownEvent | Registra un evento impostato dal runtime quando l'oggetto Scheduler viene eliminato definitivamente. |
CreateScheduleGroup | Crea un oggetto concurrency::ScheduleGroup nell'oggetto Scheduler . |
ScheduleTask | Pianifica un'attività leggera dall'oggetto Scheduler . |
GetPolicy | Recupera una copia dei criteri associati all'oggetto Scheduler . |
SetDefaultSchedulerPolicy | Imposta i criteri da usare per il runtime quando crea l'utilità di pianificazione predefinita. |
ResetDefaultSchedulerPolicy | Ripristina il criterio predefinito con quello attivo prima della chiamata a SetDefaultSchedulerPolicy . Se l'utilità di pianificazione predefinita viene creata dopo questa chiamata, il runtime usa le impostazioni dei criteri predefinite per creare l'utilità di pianificazione. |
Esempio
Per esempi di base su come creare e gestire un'istanza dell'utilità di pianificazione, vedere Procedura: Gestire un'istanza dell'utilità di pianificazione.
Vedi anche
Utilità di pianificazione
Procedura: Gestire un'istanza dell'utilità di pianificazione
Criteri dell'utilità di pianificazione
Gruppi di pianificazione