1

我有一个多线程程序,它使用 QMap 来存储一些数据,但是当调用 contains() 函数时,它时不时地崩溃,在同一行:

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--)

我相信唯一可能导致崩溃的是指针d以某种方式被删除。知道它为什么会崩溃,或者我应该如何进行调试?

谢谢

4

1 回答 1

2

您正在从多个线程访问地图实例,而无需序列化访问。你不能这样做。您必须:

  1. 在每个线程中都有地图的副本,或者

  2. 使用互斥锁序列化对地图的访问。

由于 Qt 容器是隐式共享的,因此复制地图相当便宜。必须在拥有的线程中制作副本,然后可以在任何其他线程中使用该副本。如果需要,复制的实例将线程安全地分离。

于 2014-04-11T14:21:38.007 回答