2017-02-23 3 views
-2

Wenn ich ein einfaches Programm erstellen wie ...Warum std :: mutex eine Ausnahme auslösen, wenn ich lock() aufrufen?

#include <mutex> 

std::mutex gMutex; 

int main() 
{ 
    gMutex.lock(); 
    gMutex.unlock(); 
    return 0; 
} 

... führt der Code ohne Problem. Wenn ich eine globale Instanz von std::mutex erstelle und versuche, die Methode lock() aufzurufen, wird eine Ausnahme ausgelöst. (Ich weiß nicht, die genaue Ausnahmetext, aber es beschwerte sich über eine interne des Mutexobjekt Wesen null)

Mit Blick auf den inneren Zustand des Mutex-Objekt, das ausfällt, sehe ich, dass das _Mtx_storage Mitglied hat seine _Val Setzen Sie auf 0.000000000000000000 und es ist _Pad Mitglied ist auf einen Wert ungleich Null gesetzt, die auf einen kleinen Puffer (ich glaube, es war 0x4f Bytes in der Größe) von Null-Bytes.

Wenn ich diesen Zustand mit dem oben genannten einfachen Programm vergleiche, sehe ich, dass der _Mtx_storage-Status NICHT null ist (ich glaube, es war 0.000000000002) im Code, der funktioniert. Was würde dazu führen, dass es in meiner anderen App null ist?

ich Visual C++ 2015

Alle Ideen sind willkommen bin mit. Vielen Dank!

+2

Ohne den Code zu sehen, ist es schwer zu wissen. Meine beste Vermutung ist Initialization Order Fiasco. (Läuft der Code vor 'main'? Wenn ja, woher weißt du, dass der Mutex bereits erstellt wurde?) Speicherkorruption? Halte schon das Schloss? Ein anderer Thread hat das Schloss losgelassen, ohne es zu halten? –

+0

Ich habe den Mutex in einer .cpp-Datei (global) über den nur zwei Funktionen, die es verwenden (in der gleichen CPP-Datei definiert) Ich habe Haltepunkte bei den Sperrenaufrufen, so weiß ich den ersten Aufruf fehlschlägt – charunnera

+1

Würde es Ihnen etwas ausmachen ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve), um uns zu zeigen? Code sagt mehr als eine Million Wörter. –

Antwort

1

Wahrscheinlich ist der Mutex noch nicht initialisiert. Wenn dieser Code vor main ausgeführt wird, überprüfen Sie, ob Sie das Problem replizieren können, ohne dass der Code vor main ausgeführt wird.

+0

Dies war in der Tat der Fall Ein Kollege hatte Code in eine andere Quelldatei eingecheckt, die zwei statische Objekte erzeugte (die sich darauf stützten) auf meiner allocator-Klasse, die den fraglichen Mutex enthält) Diese statischen Objekte wurden vor dem Mutex instanziiert, was zu dem Fehler führte Ich habe dies zu meiner Liste der Überraschungen hinzugefügt, die bei der Teamentwicklung auftreten können:) Danke! – charunnera

Verwandte Themen