Introduzione ai DPC con thread

I DPC in thread sono disponibili in Windows Vista e versioni successive di Windows.

Un DPC threading è un DPC eseguito dal sistema in IRQL uguale a PASSIVE_LEVEL. I CONTROLLER di dominio threadati sono abilitati per impostazione predefinita, ma è possibile disabilitarli impostando la chiave del Registro di sistema HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable su zero. Quando i DPC in thread sono disabilitati, vengono eseguiti come PDC ordinari.

Un DPC normale annulla l'esecuzione di tutti i thread e non può essere preceduto da un thread o da un altro DPC. Se il sistema dispone di un numero elevato di DPC ordinari in coda o se uno di questi controller di dominio viene eseguito per molto tempo, ogni thread rimarrà sospeso per un periodo di tempo arbitrario. Di conseguenza, ogni DPC ordinario aumenta la latenza di sistema, che può danneggiare le prestazioni delle applicazioni sensibili al tempo, ad esempio la riproduzione audio o video.

Al contrario, un DPC threadato può essere preceduto da un DPC normale, ma non da altri thread. Pertanto, è consigliabile usare controller di dominio threadati anziché PDC ordinari, a meno che un determinato DPC non debba essere preceduto, nemmeno da un altro DPC.

Il sistema rappresenta i DPC thread (e i DPC ordinari) come strutture KDPC . Per inizializzare una struttura KDPC per un DPC threading, chiamare la routine KeInitializeThreadedDpc e passarla una routine CustomThreadedDpc che esegue l'azione del DPC.

Poiché una routine CustomThreadedDpc può essere eseguita in PASSIVE_LEVEL o DISPATCH_LEVEL, è necessario assicurarsi che la routine CustomThreadedDpc venga sincronizzata correttamente in entrambi i runtime di integrazione. Per altre informazioni su come eseguire questa operazione, vedere Sincronizzazione e dpc thread.

Inoltre, è necessario assicurarsi che la routine CustomThreadedDpc rispetti tutte le restrizioni per DISPATCH_LEVEL codice. Se i DPC in thread sono abilitati, vengono eseguiti in IRQL = PASSIVE_LEVEL ma sono comunque soggetti alle stesse restrizioni dei CONTROLLER di dominio normali. Tutto il codice eseguito in un DPC threading, incluse tutte le funzioni chiamate dalla routine CustomThreadedDpc , deve essere conforme alle restrizioni dell'ambiente DPC. Ad esempio, il codice non deve bloccare gli oggetti di sincronizzazione a livello passivo, ad esempio gli oggetti KEVENT. Molti stack di dispositivi esistenti, ad esempio rete e USB, non supportano l'elaborazione DPC in thread e potrebbero tentare di bloccare se rilevano che vengono chiamati in PASSIVE_LEVEL. Per motivi simili, Kernel-Mode Driver Framework (KMDF) non supporta l'elaborazione DPC thread e i driver KMDF non devono provare a usare controller di dominio threadati. Per altre informazioni sull'ambiente DPC, vedere Scrittura di routine DPC.

Per aggiungere un DPC thread alla coda DPC, chiamare KeInsertQueueDpc. Per rimuovere un DPC thread dalla coda prima dell'esecuzione, chiamare KeRemoveQueueDpc.