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

Foi útil?

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:

    .
  1. tenha uma cópia do mapa em cada encadeamento ou

  2. Serialize o acesso ao mapa com um mutex.

  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top