Condividi tramite


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.

[Torna all'inizio]

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.

[Torna all'inizio]

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 .

[Torna all'inizio]

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.

[Torna all'inizio]

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