Perché QMap si schianta, quando la chiamata contiene (), nella funzione Findnode?
Domanda
Ho un programma multi filettato che utilizza QMAP per memorizzare alcuni dati, ma è in crashing ogni tanto, in una stessa linea, quando si contiene () viene chiamata la funzione:
myMap.contains(a)
-> Tasti e valori non sono puntatori.
Crash:
#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
La linea che si blocca è semplicemente questa linea:
for (int i = d->topLevel; i >= 0; i--)
Credo che l'unica cosa che possa causare schianto è che il puntatore d
viene cancellato in qualche modo.Qualche idea del perché è schiantato, o come dovrei procedere con il debug?
Grazie
Soluzione
Accedi a un'istanza della mappa da più thread senza serializzare l'accesso.Non puoi farlo.DEVI:
- .
-
Avere una copia della mappa in ogni filettatura o
-
serializza l'accesso alla mappa con un mutex.
Dal momento che i contenitori QT sono implicitamente condivisi, la copia di una mappa è piuttosto economica.La copia deve essere effettuata nel thread proprietario, la copia può quindi essere utilizzata in qualsiasi altro filettatura.L'istanza copiata tornerà in modo sicuro, svuotando in sicurezza se necessario.