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 に答える