共用方式為


執行緒 DPC 簡介

執行緒的 DPC 可在 Windows Vista 和更新版本的 Windows 中使用。

執行緒 DPC 是 DPC,系統在 IRQL 上執行的 DPC 等於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 常式在兩個 IRCL 上都正確地同步處理。 如需如何執行這項操作的詳細資訊,請參閱 同步處理和執行緒的 DPC

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

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