共用方式為


使用自旋鎖時防止錯誤和死結

當驅動程式例程持有旋轉鎖時,它無法引發硬體例外狀況或軟體例外狀況,否則會導致系統崩潰。 換句話說,驅動程式的ISR和驅動程式在呼叫KeSynchronizeExecution時提供的任何 SynchCritSection 例程,都不得造成錯誤或陷阱,例如頁面錯誤或算術例外狀況,而且無法引發軟體例外狀況。 呼叫 KeAcquireSpinLockKeAcquireInStackQueuedSpinLock 的例程在釋放其執行緒自旋鎖並且不再在 IRQL = DISPATCH_LEVEL 執行之前,無法造成硬體例外狀況或引發軟體例外狀況。

可分頁的數據和支援例程

持有自旋鎖時,驅動程式不得呼叫會存取可分頁資料的例行程序。 請記住,驅動程式只能在執行於 IRQL 嚴格低於 DISPATCH_LEVEL 的情況下,呼叫某些支援例程來存取可分頁的數據。 此 IRQL 限制會排除在持有自旋鎖的狀態下呼叫這些支援例程。 如需任何特定支援例程的 IRQL 需求,請參閱例程的參考頁面。

遞迴

嘗試以遞歸方式取得自旋鎖保證會導致死結:遞歸函式的持有執行個體在第二個執行個體自旋並嘗試取得相同自旋鎖的同時,無法釋放自旋鎖。

下列指導方針說明如何與遞迴程序一同使用自旋鎖:

  • 遞歸例程在保留微調鎖定時不得自行呼叫,或不得嘗試在後續呼叫時取得相同的微調鎖定。

  • 當遞歸例程保留微調鎖定時,如果遞歸可能會導致死結或導致呼叫端將微調鎖定保留超過 25 微秒,則另一個驅動程式例程不得呼叫遞歸例程。

如需遞歸驅動程式例程的詳細資訊,請參閱 使用核心堆疊

巢狀自旋鎖獲取

嘗試在持有一個自旋鎖的同時取得另一個自旋鎖,這也可能會導致死鎖或驅動程式效能下降。

下列指導方針說明驅動程式應如何持有自旋鎖:

  • 除非確定不會發生死結,否則驅動程式不得呼叫使用自旋鎖的支援例程。

  • 即使不會發生死結,驅動程式也不應呼叫使用自旋鎖的支援例程,除非其他編碼技術無法達到類似的驅動程式效能和功能。

  • 如果驅動進行巢狀呼叫以取得自旋鎖,則每次取得時必須始終以相同的順序取得自旋鎖。 此順序有助於避免死結。

一般而言,請避免使用巢狀自旋鎖來保護重疊的子集或不同的共用資料與資源集合。 請考慮當驅動程式使用兩個執行緒自旋鎖來保護離散資源時,會發生什麼情況。例如,有一對定時器物件,可能被各種驅動程式例程單獨或同時設定。 每當在SMP機器中,其中任一持有一個自旋鎖的兩個例程嘗試獲取另一個自旋鎖時,驅動程式會間歇性地發生死結。

如需取得巢狀自旋鎖的詳細資訊,請參閱 鎖定、死結和同步處理