sistemas que peterson para operativos ocupada mutua informatica exclusión exclusion espera ejemplos dekker concurrencia con biologia algoritmo linux pthreads mutex assert glibc

linux - que - Error de afirmación de exclusión mutua



exclusión mutua con espera ocupada (6)

TLDR: asegúrese de que no está bloqueando un mutex que ha sido destruido / no se ha inicializado.

Aunque el OP tiene su respuesta, pensé que compartiría mi problema en caso de que alguien más tuviera el mismo problema que yo.

Observe que la aserción está en __pthread_mutex_lock y no en el desbloqueo. Esto, para mí, sugiere que la mayoría de las personas que tienen este problema no están desbloqueando un mutex en un hilo diferente al que lo bloqueó; simplemente están bloqueando un mutex que ha sido destruido.

Para mí, tuve una clase (Llamémosla Foo ) que registró una función de devolución de llamada estática con alguna otra clase (Llamémosla Bar ). A la devolución de llamada se le pasaba una referencia a Foo y ocasionalmente bloqueaba / desbloqueaba un mutex que era miembro de Foo .

Este problema ocurrió después de que la instancia de Foo fue destruida mientras la instancia de Bar seguía usando la devolución de llamada. A la devolución de llamada se le pasaba una referencia a un objeto que ya no existía y, por lo tanto, llamaba a __pthread_mutex_lock en la memoria basura.

Tenga en cuenta que estaba usando C ++ 11 std::mutex y std::lock_guard<std::mutex> , pero, como estaba en Linux, el problema era exactamente el mismo.

Me encuentro con el siguiente error en momentos impredecibles en una aplicación de comunicaciones basada en Linux (brazo):

pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0'' failed.

Google muestra muchas referencias a ese error, pero poca información que parece relevante para mi situación. Me preguntaba si alguien me puede dar algunas ideas sobre cómo solucionar este error. ¿Alguien sabe de una causa común para esta afirmación?

Gracias por adelantado.


Estaba teniendo el mismo problema

en mi caso, dentro del hilo estaba conectando db vertica con odbc agregando la siguiente configuración a /etc/odbcinst.ini solucionado mi problema. no obteniendo la excepción hasta el momento.

[ODBC] Threading = 1

créditos a: hynek


La parte rápida de Google que he hecho a menudo culpa a un compilador de mala optimización. Una suma decente está here . Podría valer la pena mirar la salida del ensamblaje para ver si gcc está produciendo el código correcto.

O eso o estás logrando pisotear la memoria utilizada por la biblioteca pthread ... ese tipo de problemas son bastante difíciles de encontrar.


Me enfrenté con el mismo problema y Google me envió aquí. El problema con mi programa era que en algunas situaciones no estaba inicializando el mutex antes de bloquearlo.

Aunque la declaración en la respuesta aceptada es legítima, creo que no es la causa de esta afirmación fallida. Debido a que el error se informa en pthread_mutex_lock (y no se desbloquea).

Además, como siempre, es más probable que el error esté en el código fuente de los programadores en lugar del compilador.


Piedra sólida durante 4 días seguidos. Estoy declarando la victoria en este caso. La respuesta es "error de usuario estúpido" (ver comentarios arriba). Un mutex solo debe ser desbloqueado por el hilo que lo bloqueó. Gracias por acompañarme


agregar Threading = 0 en el archivo /etc/odbcinst.ini solucionó este problema