Warum stürzt QMap beim Aufruf von contains () in der findNode-Funktion ab?
Frage
Ich habe ein Multithread-Programm, das QMap zum Speichern einiger Daten verwendet, aber es stürzt ab und zu in derselben Zeile ab, wenn die Funktion contains () aufgerufen wird:
myMap.contains(a)
-> schlüssel und Werte sind keine Zeiger.
Absturz:
#0 findNode (akey=<synthetic pointer>, this=0x120eec4c) at /var/build/workspace/stage/nto/usr/include/qt4/QtCore/qmap.h:486
#1 contains (akey=<synthetic pointer>, this=0x120eec4c) at /var/build/workspace/stage/nto/usr/include/qt4/QtCore/qmap.h:555
Die Zeile, die abstürzt, ist einfach diese Zeile:
for (int i = d->topLevel; i >= 0; i--)
Ich glaube, das einzige, was zum Absturz führen kann, ist dieser Zeiger d
wird irgendwie gelöscht.Irgendeine Idee, warum es abstürzt oder wie soll ich mit dem Debuggen fortfahren?
Danke
Lösung
Sie greifen von mehreren Threads aus auf eine Karteninstanz zu, ohne den Zugriff zu serialisieren.Das kannst du nicht tun.Sie müssen entweder:
Haben Sie eine Kopie der Karte in jedem Thread, oder
Serialisieren Sie den Zugriff auf die Karte mit einem Mutex.
Da Qt-Container implizit gemeinsam genutzt werden, ist das Kopieren einer Karte ziemlich billig.Die Kopie muss im besitzenden Thread erstellt werden, die Kopie kann dann in jedem anderen Thread verwendet werden.Die kopierte Instanz wird bei Bedarf threadsicher getrennt.