GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Pthread-Mutex-Assertion-Fehler

TLDR:Stellen Sie sicher, dass Sie keinen Mutex sperren, der zerstört / nicht initialisiert wurde.

Obwohl das OP seine Antwort hat, dachte ich, ich würde mein Problem teilen, falls jemand anderes das gleiche Problem hat wie ich.

Beachten Sie, dass sich die Assertion in __pthread_mutex_lock befindet und nicht im Unlock. Dies deutet für mich darauf hin, dass die meisten anderen Personen, die dieses Problem haben, einen Mutex nicht in einem anderen Thread als dem entsperren, der ihn gesperrt hat. Sie sperren nur einen zerstörten Mutex.

Für mich hatte ich eine Klasse (nennen wir es Foo ), die eine statische Callback-Funktion bei einer anderen Klasse registriert hat (nennen wir sie Bar ). Dem Rückruf wurde eine Referenz auf Foo übergeben und würde gelegentlich einen Mutex sperren/entsperren, der ein Mitglied von Foo war .

Dieses Problem trat nach Foo auf Instanz wurde zerstört, während die Bar -Instanz verwendete immer noch den Callback. Dem Callback wurde ein Verweis auf ein Objekt übergeben, das nicht mehr existierte und daher __pthread_mutex_lock auf Garbage Memory aufrief.

Beachten Sie, dass ich std::mutex von C++11 verwendet habe und std::lock_guard<std::mutex> , aber da ich unter Linux war, war das Problem genau dasselbe.


Rock solid für 4 Tage am Stück. Ich erkläre hier den Sieg. Die Antwort ist "dummer Benutzerfehler" (siehe Kommentare oben). Ein Mutex sollte nur von dem Thread entsperrt werden, der ihn gesperrt hat. Danke, dass du mich ertragen hast.


Ich stand vor dem gleichen Problem und Google hat mich hierher geschickt. Das Problem mit meinem Programm war, dass ich in einigen Situationen den Mutex nicht initialisierte, bevor ich ihn sperrte.

Obwohl die Aussage in der akzeptierten Antwort legitim ist, denke ich, dass sie nicht die Ursache für diese fehlgeschlagene Behauptung ist. Weil der Fehler auf pthread_mutex_lock gemeldet wird (und nicht entsperren).

Außerdem ist es wie immer wahrscheinlicher, dass der Fehler eher im Quellcode des Programmierers als im Compiler liegt.


Linux
  1. MySQL-Fehlertabelle „mysql.servers“ existiert nicht

  2. pthreads mutex gegen semaphor

  3. Autoconf-Fehler auf Ubuntu 11.04

  4. Was ist :-!! im C-Code?

  5. C++-Fehler:Sleep wurde in diesem Bereich nicht deklariert

WLAN-Fehler Wpa_supplicant?

Ein Tls-Paket mit unerwarteter Länge wurde empfangen?

Kann Eclipse Ide wegen fehlendem Symlink nicht öffnen?

Dpkg-deb:Fehler:Unterprozess Einfügen wurde durch Signal beendet (gebrochene Pipe) Nginx?

MySQL-Datenbank umbenennen

sudo -i gibt einen Fehler zurück