【发布时间】:2010-09-18 21:57:01
【问题描述】:
我在运行一些传给我的旧代码时遇到了问题。它在 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.
}
在 map 的 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。
感谢大家提出多线程问题的解决方案,但这不是这个问题要解决的问题。是的,我了解所提供的代码没有得到正确的保护,并且在它试图完成的事情上过于矫枉过正。我已经实现了它的修复。我只是想更好地理解为什么会引发这个异常。
【问题讨论】:
-
了解违规地址可能很有用。有可能“this”为空,与地图本身无关。
标签: c++ multithreading exception stl