赞
踩
今天遇到一个问题,程序卡住了,卡在某个线程的 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);
经过调试发现,这个 it
的 first
和 second
的值有点奇怪,有点儿非法,并非正常情况下可能出现的值。那么,是它内存被改写了么?呸。。这么简单的问题。这个 it
有可能是 que_.end()
啊,也就是说,这个 que_
其实有可能是空的!(虽然理论上应该不会是空的,但你从来都想不全面程序会怎样执行之后,它的确空了)。
因此,千万不要这么用。要先判断 que_.empty()
或者 it == que_.end()
然后再用。否则,系统就卡在 erase
这个方法里,也不报错,也不结束。如果是单线程程序,还能一眼看到,哦,它停在这里了。万一是多线程程序,那么一堆线程,它停在哪里呢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。