Vérification de bogue 0xF : SPIN_LOCK_ALREADY_OWNED

Le contrôle de bogue SPIN_LOCK_ALREADY_OWNED a la valeur 0x0000000F. Cela indique qu’une demande de verrou de rotation a été lancée alors que le verrou de rotation est déjà détenu.

Important

Cette rubrique s’adresse aux développeurs. Si vous êtes un client qui a reçu un code d’erreur d’écran bleu lors de l’utilisation de votre ordinateur, consultez résoudre les erreurs d’écran bleu.

Paramètres SPIN_LOCK_ALREADY_OWNED

None

Cause

En règle générale, cette erreur est provoquée par une requête récursive pour un verrou de rotation. Elle peut également se produire si un verrou de rotation semblable à une requête récursive a été lancée, par exemple, lorsqu’un verrou de rotation a été acquis par un thread, puis que ce même thread appelle une fonction, qui tente également d’acquérir un verrou de rotation. La deuxième tentative d’acquisition d’un verrou de rotation n’est pas bloquée dans ce cas, car cela entraînerait un blocage irrécupérable. Si les appels sont effectués sur plusieurs processeurs, un processeur est bloqué jusqu’à ce que l’autre processeur libère le verrou.

Cette erreur peut également se produire, sans récurrence explicite, lorsque tous les threads et tous les verrous de rotation se voient affecter un IRQL. Les IRQLs de verrous SpinLock sont toujours supérieurs ou égaux au niveau DPC, mais cela n’est pas vrai pour les threads. Toutefois, un thread qui détient un verrou de rotation doit maintenir un IRQL supérieur ou égal à celui du verrou de rotation. En diminuant l’IRQL du thread sous le niveau IRQL du verrou de rotation qu’il détient, vous autorisez la planification d’un autre thread sur le processeur. Ce nouveau thread peut ensuite tenter d’acquérir le même verrou de rotation.

Résolution

Veillez à ne pas acquérir le verrou de manière récursive. De plus, pour les threads qui contiennent un verrou de rotation, assurez-vous que vous ne réduisez pas l’IRQL du thread à un niveau situé en dessous de l’IRQL du verrou de rotation qu’il détient.