QMAP가 CRASHES를 호출 할 때 QMAP가 () FindNode 함수에 포함되어 있습니까?
문제
QMAP를 사용하여 일부 데이터를 저장하는 다중 스레드 프로그램이 있지만, 이제는 () 함수가 포함될 때 매우 동일한 행에서 다음과 같이 충돌합니다.
myMap.contains(a)
-> 키와 값은 포인터가 아닙니다.
충돌 :
#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
충돌하는 선은 간단히이 행입니다.
for (int i = d->topLevel; i >= 0; i--)
나는 충돌을 일으킬 수있는 유일한 것을 믿는다는 것을 믿는다.왜 그것이 충돌하는지 또는 디버깅을 어떻게 진행해야합니까?
감사합니다
해결책
액세스를 직렬화하지 않고 여러 스레드에서지도 인스턴스에 액세스하는 것입니다.당신은 그것을 할 수 없습니다.당신은 다음 중 하나를 수행해야합니다 :
-
각 스레드 또는
맵의 복사본이 있습니다.
-
뮤텍스가있는지도에 대한 액세스를 직렬화하십시오.
Qt 컨테이너가 암시 적으로 공유되므로지도를 복사하는 것은 다소 쌉니다.소유 스레드에서 복사본을 만들어야하며 복사본을 다른 스레드에서 사용할 수 있습니다.복사 된 인스턴스가 필요한 경우 스레드가 안전하게 분리됩니다.