Frage

Ich bin Begegnung mit den folgenden Fehlern zu unvorhersehbaren Zeiten in einer Linux-basierten (Arm) Kommunikationsanwendung:

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

Google schaltet sich viele Verweise auf diesen Fehler, aber wenig Informationen, die meine Situation relevant zu sein scheint. Ich habe mich gefragt, ob jemand mir einige Ideen geben kann, wie man diese Fehler zu beheben. Kennt jemand eine häufige Ursache für diese Behauptung?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Rock solide für 4 Tage gerade. Ich erkläre den Sieg auf dieser. Die Antwort ist „dumm Benutzerfehler“ (siehe Kommentar oben). Ein Mutex sollte nur durch das Gewinde freigeschaltet werden, die es verriegelt. Vielen Dank für die mit mir tragen.

Andere Tipps

bin ich mit dem gleichen Problem konfrontiert und Google hat mich hierher geschickt. Das Problem mit meinem Programm war, dass in einigen Situationen war ich nicht den Mutex zu initialisieren, bevor es zu verriegeln.

Auch wenn die Aussage in der akzeptierten Antwort legitim ist, ich denke, es ist nicht die Ursache dafür ist gescheitert Behauptung. Da der Fehler auf pthread_mutex_lock gemeldet wird (und nicht Unlock).

Wie auch immer, ist es wahrscheinlicher, dass der Fehler in der Code-Programmierer Quelle anstelle den Compiler.

TLDR: Stellen Sie sicher, dass Sie nicht einen Mutex sind Sperren, die zerstört wurde / wurde nicht initialisiert

.

Obwohl die OP seine Antwort hat, dachte ich, ich würde mein Problem falls jemand teile sonst hat das gleiche Problem, das ich habe.

Beachten Sie, dass die Behauptung in __pthread_mutex_lock und nicht in den entriegelten. Dies ist für mich, legt nahe, dass die meisten anderen Menschen dieses Problem haben, werden nicht einen Mutex in einem anderen Thread als das Entriegeln, dass sie gesperrt; sie sind nur ein Mutex Sperren, die zerstört worden ist.

Für mich ich eine Klasse hatte (wir nennen es Foo), die eine statische Callback-Funktion mit einer anderen Klasse registriert (nennen Let it Bar). Der Callback wurde einen Verweis auf Foo weitergegeben und würde einen Mutex gelegentlich sperren / freizugeben, der ein Mitglied Foo war.

Dieses Problem trat auf, nachdem die Foo Instanz zerstört wurde, während die Bar Instanz immer noch den Rückruf verwenden. Der Rückruf wurde ein Verweis auf ein Objekt übergeben wird, die nicht mehr existiert, und deshalb wurde auf Müll Speicher Aufruf __pthread_mutex_lock.

Beachten Sie, ich wurde mit C ++ 11 der std::mutex und std::lock_guard<std::mutex>, aber da ich auf Linux wurde, das Problem genau war das gleiche.

Die schnell bisschen Googeln ich getan habe tadelt dies oft auf einer Compiler mis-Optimierung. Eine anständige Summe ist hier . Es könnte sich lohnen, bei der Montage Ausgang suchen, um zu sehen, ob gcc den richtigen Code zu erzeugen.

Entweder das, oder Sie verwalten auf dem Speicher durch die pthread-Bibliothek verwendet stampfen ... jene Art von Problemen sind eher schwierig zu finden.

Ich war mit demselben Problem

in meinem Fall im Gewinde i vertica db wurde die Verbindung mit odbc folgende Einstellung Hinzufügen /etc/odbcinst.ini mein Problem gelöst. nicht geting die Ausnahme so weit.

[ODBC]
Threading = 1

Kredite an: hynek

Hinzufügen Threading = 0 in /etc/odbcinst.ini Datei dieses Problem behoben

Ich habe gerade meinen Weg durch diese gekämpft und dachte, es anderen helfen könnten. In meinem Fall ist aufgetreten das Problem auf eine sehr einfache Methode, die das Mutex gesperrt ist, überprüfte eine gemeinsame Variable und dann zurückgegeben. Das Verfahren ist eine Überschreibung der Basisklasse, die einen Arbeiter-Thread erstellt.

Das Problem in diesem Fall war, dass die Basisklasse des Faden in dem Konstruktor wurde zu schaffen. Der Faden dann begann die Ausführung und die abgeleiteten Klassen Durchführung des Verfahrens aufgerufen wurde. Leider war die abgeleitete Klasse noch nicht abgeschlossen Bau und der Mutex in der abgeleiteten Klasse uninitialised Daten als Mutex Besitzer hatte. Dies machte es aussehen, wie es tatsächlich gesperrt wurde, wenn es nicht war.

Die Lösung ist ganz einfach. Fügen Sie eine geschützte Methode der Basisklasse genannt Startthread (). Dies muss in der abgeleiteten Klassen Konstruktor aufgerufen wird, nicht von der Basisklasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top