2009-06-26 8 views
9

Estoy depurando un problema de interbloqueo y la pila de llamadas muestra que los subprocesos están esperando en algunos eventos.Contador de bloqueo negativo de la sección crítica

El código está utilizando la sección crítica como primitiva de sincronización Creo que hay algún problema aquí. También el depurador apunta a una sección crítica que pertenece a algún otro subproceso, pero el recuento de bloqueos es -2. Según mi entendimiento, el conteo de bloqueo> 0 significa que la sección crítica está bloqueada por uno o más subprocesos.

Entonces, ¿hay alguna posibilidad de que esté buscando en la sección crítica correcta que podría ser el culpable de un punto muerto?

¿En qué escenarios puede una sección crítica tener un recuento de bloqueo negativo?

+0

Raymond Chen acaba de escribir una publicación sobre las consecuencias de dejar un CS más veces que ingresarlo. Y también vale la pena leer los tres primeros comentarios ... http://blogs.msdn.com/oldnewthing/archive/2009/06/19/9777996.aspx – eran

Respuesta

5

Supongo que está hablando de la clase CCriticalSection en MFC. Creo que estás viendo la sección crítica correcta. He descubierto que el conteo de bloqueos de la sección crítica puede ser negativo si el número de llamadas a la función de Bloqueo() es menor que el número de llamadas de Desbloqueo(). Encontré que esto generalmente ocurre en el siguiente tipo de código:

void f() 
{ 
    CSingleLock lock(&m_synchronizer, TRUE); 
    //Some logic here 
    m_synchronizer.Unlock(); 
} 

A primera vista, este código parece perfectamente seguro. Sin embargo, tenga en cuenta que estoy utilizando el método Unlock() de CCriticalSection directamente en lugar del método Unlock() de CSingleLock. Ahora, lo que sucede es que cuando la función sale, CSingleLock en su destructor vuelve a llamar a Desbloquear() de la sección crítica y su conteo de bloqueo se vuelve negativo. Después de esto, la aplicación estará en mal estado y comienzan a suceder cosas extrañas. Si está utilizando secciones críticas de MFC, verifique este tipo de problemas.

+0

LockCount depende de la versión de Windows que esté utilizando: http : //msdn.microsoft.com/en-us/library/ff541979.aspx – hfrmobile

23

Cuidado: desde Windows Server 2003 (para SO cliente this is Vista and newer) el significado de LockCount ha cambiado y -2 es un valor completamente normal, comúnmente visto cuando un hilo ha entrado en una sección crítica sin esperar y no hay otro hilo esperando el CS. Ver Displaying a Critical Section:

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

  • El bit más bajo se 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 que esperan el bloqueo.
+3

Información maravillosa que no he visto en otro lugar. Me ayudó a resolver algunos comportamientos extraños por parte de las secciones críticas. –

+2

Lo mismo que el comentario de @ mistiano. No sabía que Microsoft había cambiado la forma en que funciona LockCount en Server 2003 y posteriores. ¡El enlace fue MUY útil! –

Cuestiones relacionadas