Question

J'ai un programme multithread qui utilise QMap pour stocker certaines données, mais il plante de temps en temps, sur la même ligne, lorsque la fonction contain() est appelée :

myMap.contains(a) -> les clés et les valeurs ne sont pas des pointeurs.

Accident:

#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 ligne qui plante est simplement cette ligne :

for (int i = d->topLevel; i >= 0; i--)

Je crois que la seule chose qui peut provoquer un crash est ce pointeur d est supprimé d'une manière ou d'une autre.Avez-vous une idée de la raison pour laquelle il plante ou de la manière dont je dois procéder au débogage ?

Merci

Était-ce utile?

La solution

Vous accédez à une instance de carte à partir de plusieurs threads sans sérialiser l'accès.Tu ne peux pas faire ça.Vous devez soit :

  1. Ayez une copie de la carte dans chaque fil de discussion, ou

  2. Sérialisez l'accès à la carte avec un mutex.

Puisque les conteneurs Qt sont implicitement partagés, copier une carte est plutôt bon marché.La copie doit être faite dans le thread propriétaire, la copie peut ensuite être utilisée dans n'importe quel autre thread.L’instance copiée se détachera en toute sécurité si nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top