Я столкнулся с проблемой при запуске старого кода, который был передан мне. Это работает в 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.
}
Исключение выдается в реализации оператора карты [] при самом первом вызове оператора [] (с использованием реализации 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 не является потокобезопасным, и мне нужно внести изменения здесь. Мне в основном интересно, ПОЧЕМУ я вижу поведение, которое я описал выше.)
В соответствии с запросом, здесь приведена дополнительная информация об исключении:
Необработанное исключение в 0x00639a1c (app.exe) в app15-51-02-0944_2008-10-23.mdmp: 0xC0000005: Местоположение чтения нарушения доступа 0x00000004.
Спасибо всем, кто предлагает решения проблем многопоточности, но этот вопрос не предназначен для решения. Да, я понимаю, что представленный код не защищен должным образом и является чрезмерным в том, что он пытается сделать. У меня уже есть исправление для этого реализовано. Я просто пытаюсь лучше понять, почему это исключение было выброшено для начала.