Controllo bug 0xF: SPIN_LOCK_ALREADY_OWNED
Il controllo dei bug SPIN_LOCK_ALREADY_OWNED ha un valore pari a 0x0000000F. Ciò indica che è stata avviata una richiesta per un blocco spin quando il blocco spin era già di proprietà.
Importante
Questo articolo è destinato ai programmatori. Se si è un cliente che ha ricevuto un codice di errore della schermata blu durante l'uso del computer, vedere Risolvere gli errori della schermata blu.
parametri SPIN_LOCK_ALREADY_OWNED
Nessuno
Causa
In genere, questo errore è causato da una richiesta ricorsiva per un blocco spin. Può verificarsi anche se qualcosa di simile a una richiesta ricorsiva per un blocco spin è stato avviato, ad esempio quando un blocco spin è stato acquisito da un thread e quindi lo stesso thread chiama una funzione, che tenta anche di acquisire un blocco spin. Il secondo tentativo di acquisire un blocco di rotazione non è bloccato in questo caso perché in questo caso si verifica un deadlock irreversibile. Se le chiamate vengono effettuate su più processori, un processore verrà bloccato fino a quando l'altro processore non rilascia il blocco.
Questo errore può verificarsi anche, senza ricorsione esplicita, quando a tutti i thread e a tutti i blocchi di selezione viene assegnato un IRQL. Gli IRQL di blocco spin sono sempre maggiori o uguali al livello DPC, ma questo non è vero per i thread. Tuttavia, un thread che tiene premuto un blocco di rotazione deve mantenere un IRQL maggiore o uguale a quello del blocco di rotazione. La riduzione del thread IRQL al di sotto del livello IRQL del blocco spin che mantiene consente di pianificare un altro thread nel processore. Questo nuovo thread potrebbe quindi tentare di acquisire lo stesso blocco di selezione.
Risoluzione
Assicurarsi di non acquisire in modo ricorsivo il blocco. Inoltre, per i thread che contengono un blocco di rotazione, assicurarsi di non ridurre il thread IRQL a un livello inferiore all'IRQL del blocco di rotazione che mantiene.