1

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() 的值是多少?我假设在该线程中的查找完成之前,地图正在被清除并重新填充到另一个线程中。单凭这一点能行吗?或者交换或移动操作怎么样?

我将追踪丢失的互斥锁或其他任何东西,我只是想确保我理解所有可能的手段,我可​​以在这个上下文中进入这个状态。

4

1 回答 1

5

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

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

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

于 2012-08-29T23:03:40.780 回答