Istanze dell'utilità di pianificazione
In questo documento viene descritto il ruolo delle istanze dell'utilità di pianificazione del runtime di concorrenza e come utilizzare le classi Concurrency::Scheduler e Concurrency::CurrentScheduler per creare e gestire le istanze dell'utilità di pianificazione. Le istanze dell'utilità di pianificazione sono utili quando si desidera associare i criteri di pianificazione espliciti a specifici tipi 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 utilizzare 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 PPL (Parallel Patterns Library) o la Libreria di agenti asincroni se non si ha familiarità con il runtime di concorrenza. |
Sezioni
Classi Scheduler e CurrentScheduler
Creazione di un'istanza dell'utilità di pianificazione
Gestione della durata di un'istanza dell'utilità di pianificazione
Metodi e funzionalità
Esempio
Classi Scheduler e CurrentScheduler
L'Utilità di pianificazione consente alle applicazioni di utilizzare 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 la funzionalità correlata alla pianificazione delle attività.
Un thread associato a un'utilità di pianificazione viene definito contesto di esecuzione o semplicemente contesto. Nel contesto corrente può essere attiva una sola utilità di pianificazione alla volta. L'utilità di pianificazione attiva è anche nota come utilità di pianificazione corrente. Il runtime di concorrenza utilizza la classe Concurrency::CurrentScheduler per fornire l'accesso all'utilità di pianificazione corrente. L'utilità di pianificazione corrente di un contesto può differire dall'utilità di pianificazione corrente di un altro contesto. Il runtime non fornisce una rappresentazione a livello di processo dell'utilità di pianificazione corrente.
In genere, la classe CurrentScheduler viene utilizzata per accedere all'utilità di pianificazione corrente. La classe Scheduler è utile quando è necessario gestire un'utilità di pianificazione che non corrisponde a quella corrente.
Nelle sezioni seguenti viene descritto come creare e gestire un'istanza dell'utilità di pianificazione. Per un esempio completo relativo a tali attività, vedere Procedura: gestire un'istanza dell'utilità di pianificazione.
[vai all'inizio]
Creazione di un'istanza dell'utilità di pianificazione
Per creare un oggetto Scheduler sono disponibili i tre modi seguenti:
Se non esiste alcuna utilità di pianificazione, il runtime crea automaticamente un'utilità di pianificazione predefinita quando si utilizza la 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 oggetto Scheduler che utilizza criteri specifici e associa l'utilità di pianificazione al contesto corrente.
Il metodo Concurrency::Scheduler::Create crea un oggetto Scheduler che utilizza criteri specifici ma non associa l'utilità di pianificazione al contesto corrente.
Se si consente al runtime di creare un'utilità di pianificazione predefinita, tutte le attività simultanee condivideranno la stessa utilità di pianificazione. In genere, la funzionalità fornita dalla libreria PPL (Parallel Patterns Library) o dalla libreria di agenti asincroni viene utilizzata per eseguire il lavoro parallelo. Pertanto, non è necessario utilizzare direttamente l'utilità di pianificazione per controllarne i criteri o la durata. Quando si utilizza la libreria PPL o la libreria di agenti, il runtime crea l'utilità di pianificazione predefinita, se non esiste e la imposta come utilità di pianificazione corrente per ogni contesto. Se si crea un'utilità di pianificazione impostandola come utilità di pianificazione corrente, il runtime utilizzerà tale utilità di pianificazione. Creare istanze dell'utilità di pianificazione aggiuntive solo quando sono necessari criteri di pianificazione specifici. Per ulteriori informazioni sui criteri associati a un'utilità di pianificazione, vedere Criteri dell'utilità di pianificazione.
[vai all'inizio]
Gestione della durata di un'istanza dell'utilità di pianificazione
Il runtime utilizza un meccanismo di conteggio dei riferimenti per controllare la durata degli oggetti Scheduler.
Quando si utilizza il metodo CurrentScheduler::Create o il metodo Scheduler::Create per creare un oggetto Scheduler, 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 metodo Scheduler::Attach associa l'oggetto Scheduler al contesto corrente. impostandolo come utilità di pianificazione corrente. Quando si chiama il metodo CurrentScheduler::Create, il runtime crea un oggetto Scheduler e lo associa al contesto corrente impostando il conteggio dei riferimenti su uno. È inoltre possibile utilizzare il metodo Concurrency::Scheduler::Reference per incrementare il conteggio dei riferimenti di un oggetto Scheduler.
Il runtime decrementa il conteggio dei riferimenti quando si chiama il metodo Concurrency::CurrentScheduler::Detach per disconnettere l'utilità di pianificazione corrente o si chiama il metodo Concurrency::Scheduler::Release. Quando il conteggio dei riferimenti arriva a zero, il runtime elimina l'oggetto Scheduler dopo il completamento 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 arriva a zero e un'attività incrementa tale conteggio, il runtime non elimina l'oggetto Scheduler finché il conteggio dei riferimenti non arriva di nuovo a zero e non vengono completate tutte le attività.
Il runtime gestisce uno stack interno di oggetti Scheduler per ogni contesto. Quando si chiama il metodo Scheduler::Attach o CurrentScheduler::Create, il runtime inserisce l'oggetto Scheduler nello stack per il contesto corrente, impostandolo come utilità di pianificazione corrente. Quando si chiama CurrentScheduler::Detach, il runtime estrae l'utilità di pianificazione corrente dallo stack per il contesto corrente e imposta l'utilità precedente come utilità di pianificazione corrente.
Il runtime fornisce diversi modi per gestire la durata di un'istanza dell'utilità di pianificazione. Nella tabella seguente viene illustrato il metodo appropriato che rilascia o disconnette l'utilità di pianificazione dal contesto corrente per ogni metodo che crea o associa un'utilità di pianificazione al contesto corrente.
Metodo che crea o associa l'utilità di pianificazione |
Metodo che rilascia o disconnette l'utilità di pianificazione |
---|---|
CurrentScheduler::Create |
CurrentScheduler::Detach |
Scheduler::Create |
Scheduler::Release |
Scheduler::Attach |
CurrentScheduler::Detach |
Scheduler::Reference |
Scheduler::Release |
Se si chiama il metodo non appropriato per rilasciare o disconnettere l'utilità di pianificazione, viene generato un comportamento non specificato in runtime.
Quando, ad esempio, si utilizza la libreria PPL che consente al runtime di creare automaticamente l'utilità di pianificazione predefinita, non rilasciare o disconnettere tale utilità di pianificazione. Il runtime gestisce la durata di tutte le utilità di pianificazione create.
Poiché il runtime elimina un oggetto Scheduler solo dopo il completamento di tutte le attività, è possibile utilizzare il metodo Concurrency::Scheduler::RegisterShutdownEvent o il metodo Concurrency::CurrentScheduler::RegisterShutdownEvent per ricevere una notifica quando un oggetto Scheduler viene eliminato. Questa funzionalità è utile quando è necessario attendere il completamento di ogni attività pianificata da un oggetto Scheduler.
[vai all'inizio]
Metodi e funzionalità
In questa sezione vengono riepilogati i metodi principali delle classi CurrentScheduler e Scheduler.
La classe CurrentScheduler può essere considerata come un supporto per la creazione di un'utilità di pianificazione da utilizzare nel contesto corrente. La classe Scheduler consente di controllare un'utilità di pianificazione che appartiene a un altro contesto.
Nella tabella seguente vengono illustrati i metodi principali definiti dalla classe CurrentScheduler.
Metodo |
Descrizione |
---|---|
Crea un oggetto Scheduler che utilizza i criteri specificati e lo associa al contesto corrente. |
|
Recupera un puntatore all'oggetto Scheduler associato al contesto corrente. Questo metodo non incrementa il conteggio dei riferimenti dell'oggetto Scheduler. |
|
Disconnette l'utilità di pianificazione corrente dal contesto corrente e imposta l'utilità precedente come utilità di pianificazione corrente. |
|
Registra un evento che il runtime imposta quando viene eliminata l'utilità di pianificazione corrente. |
|
Crea un oggetto Concurrency::ScheduleGroup nell'utilità di pianificazione corrente. |
|
Aggiunge un'attività leggera alla coda di pianificazione dell'utilità di pianificazione corrente. |
|
Recupera una copia dei criteri associati all'utilità di pianificazione corrente. |
Nella tabella seguente vengono illustrati i metodi principali definiti dalla classe Scheduler.
Metodo |
Descrizione |
---|---|
Crea un oggetto Scheduler che utilizza i criteri specificati. |
|
Associa l'oggetto Scheduler al contesto corrente. |
|
Incrementa il contatore dei riferimenti dell'oggetto Scheduler. |
|
Decrementa il contatore dei riferimenti dell'oggetto Scheduler. |
|
Registra un evento che il runtime imposta quando viene eliminato l'oggetto Scheduler. |
|
Crea un oggetto Concurrency::ScheduleGroup nell'oggetto Scheduler. |
|
Pianifica un'attività leggera dall'oggetto Scheduler. |
|
Recupera una copia dei criteri associati all'oggetto Scheduler. |
|
Imposta i criteri che devono essere utilizzati dal runtime quando viene creata l'utilità di pianificazione predefinita. |
|
Ripristina i criteri predefiniti impostando i criteri che erano attivi prima della chiamata a SetDefaultSchedulerPolicy. Se l'utilità di pianificazione predefinita viene creata dopo questa chiamata, il runtime utilizza le impostazioni dei criteri predefiniti per creare l'utilità di pianificazione. |
[vai all'inizio]
Esempio
Per gli esempi di base relativi alla creazione e alla gestione di un'istanza dell'utilità di pianificazione, vedere Procedura: gestire un'istanza dell'utilità di pianificazione.
Vedere anche
Concetti
Utilità di pianificazione (runtime di concorrenza)
Altre risorse
Procedura: gestire un'istanza dell'utilità di pianificazione
Criteri dell'utilità di pianificazione
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Luglio 2010 |
Il contenuto è stato riorganizzato. |
Miglioramento delle informazioni. |