私は計算を行うC++ 11プログラムを持っており、それらの計算結果をキャッシュするのにstd::unordered_map
を使用しています。プログラムは複数のスレッドを使用し、共有のunordered_map
を使用して計算結果を保存して共有します。mutexで挿入をロックしているにもかかわらず、std :: unordered_mapとのデータ競合
unordered_map
の読み取りとSTLコンテナの仕様に基づいて
だけでなく、unordered_map thread safety、複数のスレッドで共有unordered_map
は、一度に1個のスレッドを一度に書き込みますが、多くの読者を扱うことができるようです。
したがって、std::mutex
を使用して、insert()
の呼び出しをマップにラップするので、たかだか1つのスレッドしか挿入されません。
しかし、私のfind()
コールでは、私の読書からは、一度に読むことができるはずのスレッドのように、mutexはありません。しかし、時折、データレース(TSANで検出されたもの)を取得して、SEGVで自分自身を明らかにしています。データレースは、私が上に述べたinsert()
とfind()
コールを明確に指しています。
find()
コールをミューテックスでラップすると、問題はなくなります。しかし、私はこのプログラムをできるだけ速くしようとしているので、同時読み込みをシリアル化したくありません。 (参考:gcc 5.4を使用しています)
なぜこのようなことが起こりますか? std::unordered_map
の並行性保証に関する私の理解は間違っていますか?
ライターがいるので、すべての書き込みと読み取りの呼び出しに同期が必要なので、 'shared_mutex'が必要です。 – NathanOliver
リンクされたスレッドの答えは、「* A。同時に複数のスレッドを読む、**または** * B。同じ時間に1つのスレッドを書くこと」。 **または**に注意してください。 – Pixelchemist
あなたは仕様を間違って解釈しました。単一のライターに関係なく、複数のリーダーを許可しますが、複数のリーダーは許可しません。 NathanOliverのコメント – antlersoft