繁体   English   中英

调用std :: map :: find时“映射/设置迭代器不兼容”

[英]“map/set iterators incompatible” while calling std::map::find

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迭代器不兼容”,如VC \\ include \\ xtree:321中所定义。 此错误的性质是,正在将来自两个不同容器的迭代器相互比较,但该错误来自容器自身的find函数内部! 反过来,另一个容器的迭代器可能来自哪里。

好的,症状:

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

我对广大社区的提问:

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

我将查找丢失的互斥锁或其他任何内容,我只想确保自己了解在给定上下文的情况下可以进入此状态的所有可行方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM