findNode 関数で contains() を呼び出すと QMap がクラッシュするのはなぜですか?
質問
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
何らかの形で削除されます。クラッシュする理由、またはデバッグをどのように進めるべきかわかりますか?
ありがとう
解決
アクセスをシリアル化せずに、複数のスレッドからマップ インスタンスにアクセスしています。それをしてはいけない。次のいずれかを行う必要があります。
各スレッドにマップのコピーを用意するか、
ミューテックスを使用してマップへのアクセスをシリアル化します。
Qt コンテナは暗黙的に共有されるため、マップのコピーはかなり安価です。コピーは所有スレッドで作成する必要があり、そのコピーは他のスレッドで使用できます。コピーされたインスタンスは、必要に応じてスレッドセーフに切り離されます。