STL模版容器对于有点水平的码农应该不陌生,在单线程中我们常常使用下面访问遍历容器元素,以 vector 为例
vector <int> v;
操作1:v.pushback(1);
操作2: for(vector<int>::iterator it = v.begin(); it != v.end(); it ++)
{
// do something
}
以上代码在单线程中执行是没有问题的,但如果将上述两个操作分别在两个线程中实现,就会出现越界问题,越界的原因是迭代器的状态没有得到及时更新的,
线程1: v.pushback(2); 此操作导致 v.end()发生变化,但 it 没有发生变化,
线程2: 该线程在循环的过程中,容器v的内容发生变化,导致 it 判断是否到达 时使用的 v.end()值与首次循环时不一致, 以至于 进行 ++操作时越界
解决方法:
使用下标:
int size = v.size(); 在进入遍历循环前,确定遍历的元素个数,
for(int i = 0;i < size; i ++)
{
// do some thing
}
这样解决的缺点有:新加入的元素需要下次遍历时才得以访问。
本解决方法经过测试,稳定运行