Istanze dell'utilità di pianificazione
Questo documento descrive il ruolo delle istanze dell'utilità di pianificazione in fase di esecuzione della concorrenza e come utilizzare il concurrency::Scheduler e concurrency::CurrentScheduler classi 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.Il concurrency::Scheduler classe rappresenta un'istanza dell'utilità di pianificazione e incapsula le funzionalità correlate alla pianificazione di 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 il concurrency::CurrentScheduler classe 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.
Top
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 concurrency::CurrentScheduler::Create metodo crea un Scheduler oggetto che utilizza un criterio specifico e tale utilità consente di associare il contesto corrente.
Il concurrency::Scheduler::Create metodo crea un Scheduler oggetto che utilizza un criterio specifico, ma non associa con il 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.
Top
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 di incrementa il conteggio dei riferimenti quando si chiama il concurrency::Scheduler::Attach metodo.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 concurrency::Scheduler::Reference metodo per incrementare il conteggio dei riferimenti di un Scheduler oggetto.
Decrementa il runtime il conteggio dei riferimenti quando si chiama il concurrency::CurrentScheduler::Detach metodo per scollegare l'utilità di pianificazione corrente, oppure chiamare il concurrency::Scheduler::Release metodo.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 non distrugge un Scheduler oggetto prima di aver completato tutte le attività, è possibile utilizzare la concurrency::Scheduler::RegisterShutdownEvent metodo o la concurrency::CurrentScheduler::RegisterShutdownEvent metodo per ricevere una notifica quando un Scheduler oggetto viene eliminato.Questa funzionalità è utile quando è necessario attendere il completamento di ogni attività pianificata da un oggetto Scheduler.
Top
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 concurrency::ScheduleGroup oggetto nella 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 concurrency::ScheduleGroup oggetto di Scheduler oggetto. |
|
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. |
Top
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
Attività
Procedura: gestire un'istanza dell'utilità di pianificazione
Concetti
Utilità di pianificazione (runtime di concorrenza)