Por que o QMap trava ao chamar contains(), na função findNode?
Pergunta
Eu tenho um programa multithread que usa QMap para armazenar alguns dados, mas ele trava de vez em quando, na mesma linha, quando a função contains() é chamada:
myMap.contains(a)
-> chaves e valores não são ponteiros.
Colidir:
#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
A linha que está travando é simplesmente esta linha:
for (int i = d->topLevel; i >= 0; i--)
Acredito que a única coisa que pode causar travamento é aquele ponteiro d
é excluído de alguma forma.Alguma ideia de por que está travando ou como devo proceder com a depuração?
Obrigado
Solução
Você está acessando uma instância de mapa de vários threads sem serializando o acesso.Você não pode fazer isso.Você deve:
- .
-
tenha uma cópia do mapa em cada encadeamento ou
-
Serialize o acesso ao mapa com um mutex.
Como os contêineres QT são implicitamente compartilhados, copiando um mapa é bastante barato.A cópia deve ser feita no thread de propriedade, a cópia pode ser usada em qualquer outro segmento.A instância copiada enfileirará segurar com segurança, se necessário.