私に受け継がれた古いコードを実行しているときに問題が発生しました。99% の確率で動作しますが、「違反の読み取り場所」という例外が発生することがあります。プロセスの存続期間全体でこのコードを実行する可能性のあるスレッドの数は可変です。発生頻度が低いのは競合状態を示している可能性がありますが、この場合に例外が発生する理由はわかりません。問題のコードは次のとおりです。
MyClass::Dostuff()
{
static map<char, int> mappedChars;
if (mappedChars.empty())
{
for (char c = '0'; c <= '9'; ++c)
{
mappedChars[c] = c - '0';
}
}
// More code here, but mappedChars in not changed.
}
operator[] への最初の呼び出しで、マップの operator[] 実装で例外がスローされます (STL の VS2005 実装を使用します)。
mapped_type& operator[](const key_type& _Keyval)
{
iterator _Where = this->lower_bound(_Keyval); //exception thrown on the first line
// More code here
}
私はすでに operator[] でスレッドをフリーズし、それらをすべて同時に実行しようとしましたが、その方法論を使用して例外を再現することはできませんでした。
それがスローされる理由を思いつくことができますか?
(はい、STL がスレッド セーフではないことはわかっています。ここで変更を加える必要があります。上記の動作が見られる理由について最も興味があります。)
リクエストに応じて、ここで例外に関する詳細をいくつか説明します:
app15-51-02-0944_2008-10-23.mdmp の 0x00639a1c (app.exe) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000004。
マルチスレッドの問題の解決策を提案してくれた皆さんに感謝しますが、これはこの質問が意図しているものではありません。はい、提示されたコードが正しく保護されておらず、達成しようとしていることが過剰であることは理解しています。私はすでにそれに対する修正を実装しています。そもそもこの例外がスローされた理由をよりよく理解しようとしています。