多线程中使用迭代器 访问 STL 容器元素的越界问题
2015-12-21 14:16
330 查看
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
}
这样解决的缺点有:新加入的元素需要下次遍历时才得以访问。
本解决方法经过测试,稳定运行
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
}
这样解决的缺点有:新加入的元素需要下次遍历时才得以访问。
本解决方法经过测试,稳定运行
相关文章推荐
- python代码打包
- UML基础知识
- iOS中3DES加密算法的原理
- CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换
- 【转】关于onActivityResult方法不执行的问题汇总
- 遍历 USB devcie,读取设备描述符 device descriptor【转】
- Robot Freamwork 安装&配置文档
- phpstorm安装
- mybatis:元素内容必须由格式正确的字符数据或标记组成
- ios静态库开发中的那些坑
- Spring事务配置方式(一) 拦截器方式配置
- 数据库存储、网络访问都必须放到异步请求中实现。
- js复选框相关事件
- ServletConfig与ServletContext对象详解
- ubuntu下用alias命名别名
- objective-c语言_data的转换
- 剑指offer系列之六十二:数据流中的中位数
- 使用select into复制表
- grails中使用quartz编写定时任务
- windows下clang的安装与使用