web-dev-qa-db-fra.com

Erreur d'assertion mutex Pthread

Je rencontre l'erreur suivante à des moments imprévisibles dans une application de communication sous Linux (arm):

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

Google a trouvé de nombreuses références à cette erreur, mais peu d'informations qui semblent pertinentes pour ma situation. Je me demandais si quelqu'un pouvait me donner quelques idées sur la façon de résoudre cette erreur. Est-ce que quelqu'un connaît une cause commune à cette affirmation?

Merci d'avance.

33
Dave Causey

Rock solide pendant 4 jours d'affilée. Je déclare la victoire sur celui-ci. La réponse est "erreur d'utilisateur stupide" (voir les commentaires ci-dessus). Un mutex ne doit être déverrouillé que par le thread qui l'a verrouillé. Merci de vous occuper de moi.

24
Dave Causey

J'ai été confronté au même problème et Google m'a envoyé ici. Le problème avec mon programme était que dans certaines situations, je n'avais pas initialisé le mutex avant de le verrouiller.

Bien que la déclaration dans la réponse acceptée soit légitime, je pense que ce n'est pas la cause de cette affirmation manquée. Parce que l'erreur est signalée sur pthread_mutex_lock (et pas unlock).

En outre, comme toujours, il est plus probable que l'erreur soit dans le code source du programmeur plutôt que dans le compilateur.

2
Shayan Pooya

La partie rapide de Googling que j'ai faite attribue souvent ceci à une mauvaise optimisation du compilateur. Une sommation décente est ici . Il pourrait être utile de regarder la sortie de Assembly pour voir si gcc produit le bon code. 

Ou bien vous parvenez à piétiner la mémoire utilisée par la bibliothèque pthread ... ces types de problèmes sont plutôt difficiles à trouver.

1
Chris Arguin

TLDR: Assurez-vous de ne pas verrouiller un mutex qui a été détruit/n'a pas été initialisé.

Bien que le PO ait sa réponse, je pensais partager mon problème si quelqu'un d'autre avait le même problème que moi.

Notez que l'assertion est dans __pthread_mutex_lock et non dans le déverrouillage. Ceci, à mon sens, suggère que la plupart des autres personnes ayant ce problème ne déverrouillent pas un mutex dans un thread différent de celui qui l'a verrouillé; ils ne font que verrouiller un mutex qui a été détruit.

Pour moi, j'avais une classe (appelons-la Foo) qui enregistrait une fonction de rappel statique avec une autre classe (appelons-la Bar). Le rappel recevait une référence à Foo et bloquait/déverrouillait parfois un mutex membre de Foo

Ce problème s'est produit après la destruction de l'instance Foo alors que l'instance Bar utilisait toujours le rappel. Le rappel était en train de transmettre une référence à un objet qui n'existait plus et, par conséquent, appelait __pthread_mutex_lock sur une mémoire erronée.

Notez que j’utilisais les std::mutex et std::lock_guard<std::mutex> de C++ 11, mais comme j’étais sous Linux, le problème était exactement le même.

1
rationalcoder

J'avais le même problème 

dans mon cas, à l'intérieur du fil, je connectais vertica db avec odbc , en ajoutant le paramètre suivant à /etc/odbcinst.ini qui résolvait mon problème. ne pas obtenir l'exception jusqu'à présent.

[ODBC]
Threading = 1

crédits à: hynek

0
ismail

l'ajout de Threading = 0 dans le fichier /etc/odbcinst.ini a résolu ce problème

0
stanley emmanuel