共用方式為


線程 DPC 簡介

具線程的 DPC 是一種 DPC,系統在執行時其 IRQL 等於 PASSIVE_LEVEL。 默認啟用線程 DPC,但您可以將 HKLM\System\CCS\Control\SessionManager\Kernel\ThreadDpcEnable 登錄機碼設定為零來停用它們。 當執行緒化的 DPC 停用時,它們會以一般 DPC 的形式執行。

一般的 DPC 會優先搶佔所有線程的執行,而且不能被線程或其他 DPC 搶佔。 如果系統已排入大量一般 DPC 的佇列,或其中一個 DPC 長時間執行,每個執行緒都會持續暫停一段不確定的長時間。 因此,每個一般 DPC 都會增加系統延遲,這可能會損害時間敏感應用程式的效能,例如音訊或視訊播放。

相反地,線程化 DPC 可以被一般 DPC 搶先,但不能被其他線程中斷。 因此,您應該使用線程化的 DPC,而不是普通的 DPC,除非特定的 DPC 必須不能被搶占,甚至不能被其他 DPC 搶占。

系統會以 KDPC 結構來表示線程 DPC(和一般 DPC)。 若要初始化線程 DPC 的 KDPC 結構,請呼叫 KeInitializeThreadedDpc 例程,並將執行 DPC 動作的 CustomThreadedDpc 例程傳遞給它。

因為 CustomThreadedDpc 例程可以在 PASSIVE_LEVEL 或 DISPATCH_LEVEL 執行,因此您必須確定 CustomThreadedDpc 例程在兩個 IRQL 上都正確同步。 如需有關如何執行這項作業的詳細資訊,請參閱 同步處理和執行緒 DPC

此外,您必須確定您的 CustomThreadedDpc 例程遵守DISPATCH_LEVEL程式代碼的所有限制。 如果已啟用多執行緒的 DPC,它們會在 IRQL = PASSIVE_LEVEL 執行,但仍受限於與一般 DPC 相同的限制。 在線程 DPC 中執行的所有程式代碼,包括 CustomThreadedDpc 例程所呼叫的所有函式,都必須符合 DPC 環境的限制。 例如,程式代碼不得封鎖被動層級同步處理物件,例如 KEVENT物件。 許多現有的裝置堆疊,例如網路和 USB,並不支援多執行緒 DPC 處理,而且如果偵測到在 PASSIVE_LEVEL 呼叫它們,它們可能會嘗試阻止。 基於類似的原因,Kernel-Mode Driver Framework (KMDF) 不支援線程 DPC 處理,而 KMDF 驅動程式不應該嘗試使用線程式 DPC。 如需 DPC 環境的詳細資訊,請參閱 撰寫 DPC 例程

若要將線程 DPC 新增至 DPC 佇列,請呼叫 KeInsertQueueDpc。 若要在執行之前從佇列中移除線程 DPC,請呼叫 KeRemoveQueueDpc