调用std :: map :: find时,"map/set iterators incompatible"

Mat*_*ton 1 c++ iterator map visual-studio-2010 c++11

C++ 0x11(有点.你知道,微软和所有...),Visual Studio 2010 SP1,Windows 7企业版.

我有一个功能:

// 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.
}
Run Code Online (Sandbox Code Playgroud)

在std :: map :: find的主体内,有一个迭代器比较,我收到错误消息"map/set iterators incompatible",如VC\include\xtree:321中所定义.这个错误的本质是来自两个不同容器的迭代器相互比较,但错误来自容器自己的查找功能!从零开始,另一个容器的迭代器可能来自何处.

好的,症状:

  • 一个线程应用程序.
  • 它仅在运行时,在实际应用程序的随机压力测试期间发生.
  • 我们没有看到任何类型的无效或明显的垃圾场.

我对更大社区的问题:

假设这是一个线程环境中的计时错误,可以改变映射的内部状态,在这个过程中途,修改模板类的值_Tree_const_iterator :: _ Getcont()?我假设在此线程中的查找完成之前,正在清除并重新填充另一个线程中的映射.可以这样做吗?或者交换或移动操作怎么样?

我将追踪丢失的互斥锁或其他什么,我只是想确保我理解所有合理的方法,我可以进入这种状态,给定这个上下文.

Nic*_*las 5

假设这是线程环境中的计时错误

然后所有的赌注都关闭了.如果您的代码是线程化的并且不是线程安全的,那么您可以获得各种错误.std::map是不是线程安全的(在修改时你无法访问它),所以你可能会遇到很多种错误.

在假设其他错误之前,请确保您的代码是线程安全的.