2012-10-18 11 views
5

Usiamo un PPL Concurrency :: TaskScheduler per inviare eventi dalla nostra pipeline multimediale ai client sottoscritti (in genere un'app GUI).Come implementare un back-off con l'utilità di pianificazione delle attività leggera di Microsoft PPL?

Questi eventi sono C++ lambda passati a Concurrency :: TaskScheduler :: ScheduleTask().

Ma, sotto carico, la pipeline può generare eventi a un tasso maggiore di quello che il cliente può consumare.

Esiste una strategia PPL posso utilizzare per causare il dispatcher di eventi per non coda un evento (in realtà, un'operazione pianificata) se la 'coda' di operazioni pianificate è maggiore di N? E se no, come faccio a rotolare il mio?

risposta

1

Guardando all'API, sembra che non ci sia modo di sapere se lo scheduler è sotto carico pesante o no, né esiste un modo per dirgli come comportarsi in tali circostanze. La mia comprensione è che mentre è possibile impostare dei limiti sul numero di thread verificabili che possono essere eseguiti all'interno di un programma di pianificazione utilizzando le politiche, il protocollo con cui lo scheduler può accettare o rifiutare nuove attività non mi è chiaro.

La mia scommessa è che dovrete implementare quel meccanismo da soli, contando quante attività ci sono già nel programmatore, e avere una coda di dimensioni limitate prima del programmatore che vi aiuti a mitigare il flusso delle attività in arrivo.

Suppongo che si possa usare una semplice coda std :: per i lambda, e ogni volta che si ha un nuovo evento, si controlla quante attività sono in esecuzione e si aggiunge il maggior numero possibile dalla coda per raggiungere il massimo conteggio attività in esecuzione. Se la coda è ancora piena, si rifiuta la nuova attività.

Per gestire l'accounting delle attività in esecuzione, è possibile avvolgere le attività con una funzione che decrementa il contatore al momento del completamento (utilizzare un mutex per evitare le gare) e incrementare il contatore quando si pianifica una nuova attività.

Problemi correlati