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.
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.
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.
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.
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.
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
l'ajout de Threading = 0 dans le fichier /etc/odbcinst.ini a résolu ce problème