2011-09-13 9 views
7

¿Hay alguna circunstancia en la que el campo LockCount de una estructura RTL_CRITICAL_SECTION en Windows pueda ser legítimamente negativo?¿En qué circunstancias una Sección crítica de Windows puede tener un Conteo de bloqueo negativo?

Estamos rastreando un accidente muy elusivo y un síntoma que estamos viendo es un CS con un LockCount negativo. En el momento del colapso, el recuento es -6, pero parece ser rutinariamente -1, -2, etc.

Antes de continuar después de eso en el supuesto de que es una muy mala cosa para esto ocurrir, solo quiero verificar que esa suposición es correcta. Puedo encontrar poca o ninguna información sobre el funcionamiento interno de RTL_CRITICAL_SECTION.

Respuesta

11

El recuento de bloqueos negativos es un comportamiento normal en algunas versiones de Windows. Tenga en cuenta que el significado de este campo ha cambiado durante la vida útil de Windows (consulte a continuación).

La interpretación de estos campos privados es un asunto complicado y puede beneficiarse del uso de herramientas de depuración de secciones críticas dedicadas.

Por ejemplo, consulte este MSDN article para obtener más información. En particular, creo que muestra por qué un valor de -6 es perfectamente plausible.

Algunos extractos pertinentes:

secciones críticas se pueden visualizar en el modo de usuario por una variedad de métodos diferentes. El significado exacto de cada campo depende de la versión de la versión de Microsoft Windows que esté utilizando.

......

En Microsoft Windows 2000, y Windows XP, el campo cuenta de bloqueos indica el número de veces que cualquier mensaje ha llamado la rutina EnterCriticalSection para esta sección crítica, menos uno. Este campo comienza en -1 para una sección crítica desbloqueada. Cada llamada de EnterCriticalSection incrementa este valor; cada llamada de LeaveCriticalSection lo disminuye. Por ejemplo, si LockCount es 5, esta sección crítica está bloqueada, un hilo la ha adquirido y cinco hilos adicionales están esperando este bloqueo.

......

En Microsoft Windows Server 2003 Service Pack 1 y versiones posteriores de de Windows, el campo cuenta de bloqueos se analiza como sigue:

  • El bit más bajo muestra el estado de bloqueo . Si este bit es 0, la sección crítica está bloqueada; si es 1, la sección crítica no está bloqueada.
  • El siguiente bit muestra si se ha despertado un hilo para este bloqueo. Si este bit es 0, entonces se ha despertado un hilo para este bloqueo; si es 1, no se ha despertado ningún hilo.
  • Los bits restantes son los que complementan el número de subprocesos esperando el bloqueo.

A continuación, pasa a explicar cómo interpretar un recuento de bloqueo de -22. Entonces, en resumen, ¡es más complicado de lo que piensas!

5

De here, es una explicación parcial:

cuenta de bloqueos Este es el campo más importante en una sección crítica. Se inicializa con un valor de -1; un valor de 0 o mayor indica que la sección crítica es propiedad o está en posesión. Cuando no es igual a -1, el campo OwningThread (este campo está incorrectamente definido en WINNT.H -debe ser un DWORD en lugar de un HANDLE) contiene el identificador que posee esta sección crítica. El delta entre este campo y el valor de (RecursionCount -1) indica cuántos hilos adicionales están esperando para adquirir la sección crítica.

+2

"Un valor de 0 o mayor indica que la sección crítica es propiedad o propiedad" puede haber sido cierta una vez pero ya no es así en Windows moderno. –

+0

Esta respuesta es obsoleta y debería eliminarse. –

Cuestiones relacionadas