GNU/Linux >> Tutoriels Linux >  >> Linux

Erreur d'assertion de mutex Pthread

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

Bien que l'OP ait sa réponse, j'ai pensé partager mon problème au cas où quelqu'un d'autre aurait le même problème que moi.

Notez que l'assertion est dans __pthread_mutex_lock et non dans le déverrouillage. Cela, pour moi, 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 verrouillent juste un mutex qui a été détruit.

Pour moi, j'avais un cours (appelons-le Foo ) qui a enregistré une fonction de rappel statique avec une autre classe (appelons-la Bar ). Le rappel passait une référence à Foo et verrouillait/déverrouillait occasionnellement un mutex membre de Foo .

Ce problème est survenu après le Foo instance a été détruite alors que le Bar l'instance utilisait toujours le rappel. Le rappel recevait une référence à un objet qui n'existait plus et, par conséquent, appelait __pthread_mutex_lock sur la mémoire des ordures.

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


Solide comme un roc pendant 4 jours d'affilée. Je déclare victoire sur celui-ci. La réponse est "erreur stupide de l'utilisateur" (voir les commentaires ci-dessus). Un mutex ne doit être déverrouillé que par le thread qui l'a verrouillé. Merci de m'avoir supporté.


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'initialisais pas 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 ratée. Parce que l'erreur est signalée sur pthread_mutex_lock (et pas déverrouiller).

De plus, comme toujours, il est plus probable que l'erreur se trouve dans le code source du programmeur plutôt que dans le compilateur.


Linux
  1. Mes 3 versions Linux préférées

  2. RT:Request Tracker – Erreur :rt-mailgate – Erreur de serveur non définie – 500 Impossible de se connecter ou de vérifier le certificat [Résolu]

  3. Erreur Wi-Fi Wpa_supplicant ?

  4. La table d'erreurs MySQL 'mysql.servers' n'existe pas

  5. Échec du clonage Git :échec de la vérification du certificat du serveur

Un paquet Tls d'une longueur inattendue a été reçu ?

Fichier .desktop. Une erreur s'est produite lors du lancement de l'application ?

Impossible d'ouvrir Eclipse Ide en raison d'un lien symbolique manquant ?

Renommer la base de données MySQL

Erreur d'E/S sous Linux :impossible de supprimer le répertoire en tant que root

sudo -i renvoie une erreur