我在运行一些传给我的旧代码时遇到了问题。它在 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。
感谢大家提出多线程问题的解决方案,但这不是这个问题要解决的问题。是的,我理解所提供的代码没有得到正确的保护,并且在它试图完成的事情上是矫枉过正的。我已经实现了它的修复。我只是想更好地理解为什么会引发这个异常。