Condividi tramite


Servizio di ordinamento dei thread

Il servizio di ordinamento dei thread controlla l'esecuzione di uno o più thread client. Garantisce che ogni thread client venga eseguito una sola volta durante il periodo specificato e in ordine relativo.

Windows Server 2003 e Windows XP: Il servizio di ordinamento dei thread è disponibile a partire da Windows Vista e Windows Server 2008.

Il servizio di ordinamento dei thread è disattivato per impostazione predefinita e deve essere avviato dall'utente. Mentre il servizio di ordinamento dei thread è in esecuzione, viene attivato ogni 5 secondi per verificare se è presente una nuova richiesta, anche se il sistema è inattiva. Ciò impedisce al sistema di dormire per più di 5 secondi, causando un consumo di energia maggiore da parte del sistema. Se l'efficienza energetica è fondamentale per l'applicazione, è preferibile non usare il servizio di ordinamento dei thread e consentire all'utilità di pianificazione del sistema di gestire l'esecuzione dei thread.

Ogni thread client appartiene a un gruppo di ordinamento dei thread. Il thread padre crea uno o più gruppi di ordinamento dei thread chiamando la funzione AvRtCreateThreadOrderingGroup . Il thread padre usa questa funzione per specificare il periodo per il gruppo di ordinamento dei thread e un intervallo di timeout.

I thread client aggiuntivi chiamano la funzione AvRtJoinThreadOrderingGroup per aggiungere un gruppo di ordinamento dei thread esistente. Questi thread indicano se devono essere predecessori o successori del thread padre nell'ordine di esecuzione. Ogni thread client deve completare una determinata quantità di elaborazione ogni periodo. Tutti i thread all'interno del gruppo devono completare l'esecuzione entro il periodo più l'intervallo di timeout.

I thread di un gruppo di ordinamento dei thread racchiudono il codice di elaborazione all'interno di un ciclo controllato dalla funzione AvRtWaitOnThreadOrderingGroup . In primo luogo, i thread predecessori vengono eseguiti uno alla volta nell'ordine in cui si uniscono al gruppo, mentre i thread padre e successori vengono bloccati nelle chiamate ad AvRtWaitOnThreadOrderingGroup. Al termine dell'elaborazione di ogni thread predecessore, il controllo dell'esecuzione torna all'inizio del ciclo di elaborazione e il thread chiama di nuovo AvRtWaitOnThreadOrderingGroup per bloccare fino al successivo turno. Dopo che tutti i thread predecessori hanno chiamato questa funzione, il servizio di ordinamento dei thread può pianificare il thread padre. Infine, quando il thread padre termina l'elaborazione e chiama di nuovo AvRtWaitOnThreadOrderingGroup , il servizio di ordinamento dei thread può pianificare i thread successori uno alla volta nell'ordine in cui sono stati aggiunti al gruppo. Se tutti i thread completano l'esecuzione prima del termine di un periodo, tutti i thread attendono fino a quando il resto del periodo scade prima che venga eseguito di nuovo.

Quando il client non deve più essere eseguito come parte del gruppo di ordinamento dei thread, chiama la funzione AvRtLeaveThreadOrderingGroup per rimuoverla dal gruppo. Si noti che il thread padre non deve rimuovere se stesso da un gruppo di ordinamento dei thread. Se un thread non completa l'esecuzione prima del periodo più l'intervallo di timeout trascorso, viene eliminato dal gruppo.

Il thread padre chiama la funzione AvRtDeleteThreadOrderingGroup per eliminare il gruppo di ordinamento dei thread. Il gruppo di ordinamento dei thread viene eliminato anche se il thread padre non completa l'esecuzione prima del periodo più l'intervallo di timeout trascorso. Quando il gruppo di ordinamento dei thread viene eliminato definitivamente, tutte le chiamate ad AvRtWaitOnThreadOrderingGroup dai thread di tale gruppo hanno esito negativo o si verifica il timeout.