当前位置:   article > 正文

【C++】慎用 erase(iterator),尤其在多线程中_c++ iterator erase

c++ iterator erase

今天遇到一个问题,程序卡住了,卡在某个线程的 join 方法中,等待该线程结束。
由于缺失多线程编程调试经验,加了半天 log 仍未定位到问题的所在。
后来在同事的指导下,通过 debug 模式在卡住时暂停,找到大概卡住的线程之后,发现,系统卡在一句 que_.erase(it) 上。
这段程序大致如下:

// std::map<int, int> que_;
// que_[somevalue] = somevalue2;
auto it = que_.begin();
int use_its_value = it->first;
int use_its_another_value = it->second;
que_.erase(it);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

经过调试发现,这个 itfirstsecond 的值有点奇怪,有点儿非法,并非正常情况下可能出现的值。那么,是它内存被改写了么?呸。。这么简单的问题。这个 it 有可能是 que_.end() 啊,也就是说,这个 que_ 其实有可能是空的!(虽然理论上应该不会是空的,但你从来都想不全面程序会怎样执行之后,它的确空了)。
因此,千万不要这么用。要先判断 que_.empty() 或者 it == que_.end() 然后再用。否则,系统就卡在 erase 这个方法里,也不报错,也不结束。如果是单线程程序,还能一眼看到,哦,它停在这里了。万一是多线程程序,那么一堆线程,它停在哪里呢?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/267908
推荐阅读
相关标签
  

闽ICP备14008679号