C++ 0x11(有点。你知道,微软,等等),Visual Studio 2010 SP1,Windows 7 Enterprise。
我有一个功能:
// typedef boost::variant</*stuff*/> value_t;
// typedef unsigned short key_t
// typedef std::map<key_t, value_t> map_t
value_t find(const key_t key, const map_t &map)
{
const map_t::const_iterator iter(map.find(key));
// ...More stuff and then return.
}
在 std::map::find 的主体中,有一个迭代器比较,我收到错误消息“map/set iterators incompatible”,如 VC\include\xtree:321 中所定义。这个错误的本质是来自两个不同容器的迭代器被相互比较,但错误来自容器自己的 find 函数!!!反过来说,另一个容器的迭代器是从哪里来的。
好的,症状:
- 这是一个线程应用程序。
- 它只发生在运行时,在实际应用程序的随机压力测试期间。
- 我们没有看到任何无效或明显的垃圾字段。
我对更大社区的问题:
假设这是线程环境中的计时错误,是否可以在此过程的中途更改映射的内部状态,修改模板类_Tree_const_iterator::_Getcont() 的值是多少?我假设在该线程中的查找完成之前,地图正在被清除并重新填充到另一个线程中。单凭这一点能行吗?或者交换或移动操作怎么样?
我将追踪丢失的互斥锁或其他任何东西,我只是想确保我理解所有可能的手段,我可以在这个上下文中进入这个状态。