C++ 0x11(有点像。你知道的,Microsoft 和所有...),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 中所定义。此错误的本质是来自两个不同容器的迭代器正在相互比较,但错误来自在容器自己的查找函数中!!! 反过来说,另一个容器的迭代器可能来自哪里来自。
好的,症状:
- 这是一个线程应用程序。
- 它只发生在运行时,在实际应用程序的随机压力测试期间。
- 我们没有看到任何类型的无效或明显的垃圾字段。
我对更大社区的问题:
假设这是线程环境中的计时错误,能否在这个过程的中途更改映射的内部状态,修改模板类 _Tree_const_iterator::_Getcont() 的值?我假设在该线程中的查找完成之前, map 正在被清除并在另一个线程中重新填充。仅此一项就可以吗?或者交换或移动操作怎么样?
我将追踪丢失的互斥锁或其他任何东西,我只是想确保我了解在给定上下文的情况下我可以进入此状态的所有合理方法。
最佳答案
Supposing this is a timing error in a threaded environment
然后所有赌注都关闭了。如果您的代码是线程化的并且不是线程安全的,那么您可能会遇到各种错误。 std::map
不是线程安全的(当它被修改时你不能访问它),所以你可能会遇到很多错误。
在假设其他地方出错之前,请确保您的代码是线程安全的。
关于c++ - 调用 std::map::find 时出现 "map/set iterators incompatible",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186472/