多线程都是读访问一个std::vector(通过const迭代器),需要另加锁么?(详细研究过标准库的同学出来赐教)

FanTasyCC 2011-09-03 09:19:22
以我现在对vector内部实现的理解,是不需要的,需要高手确认一下,谢谢!
尽量避免加锁的原则(效率原因,我不想加锁)

...全文
1345 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
forlove89 2011-09-04
  • 打赏
  • 举报
回复
如果是只读就不需要;
如果是多个线程同时访问,并且有写的权限,就需要加锁和解锁操作
qq120848369 2011-09-03
  • 打赏
  • 举报
回复
都是读就不需要。
mymtom 2011-09-03
  • 打赏
  • 举报
回复
楼主的情况是只读访问
[Quote=引用 7 楼 wangjunsheng 的回复:]

vector 被多个线程同时访问的话 就得加锁

否则你a 线程在 读
这时切换到了 b线程
b线程push_back 导致了vector重现分配 迭代器可就失效了
又切换回a线程
a线程的迭代器不就有问题了,程序不得崩溃啦 :)
[/Quote]
melos 2011-09-03
  • 打赏
  • 举报
回复
读不需要。加锁是为了避免在读的过程中数据被更改或两个线程同时修改某一资源。只读,这两者都不会发生,无需加锁
读不需要。加锁是为了避免在读的过程中数据被更改或两个线程同时修改某一资源。只读,这两者都不会发生,无需加锁

乃不知有汉 2011-09-03
  • 打赏
  • 举报
回复
vector 被多个线程同时访问的话 就得加锁

否则你a 线程在 读
这时切换到了 b线程
b线程push_back 导致了vector重现分配 迭代器可就失效了
又切换回a线程
a线程的迭代器不就有问题了,程序不得崩溃啦 :)



PG 2011-09-03
  • 打赏
  • 举报
回复
NO~
pathuang68 2011-09-03
  • 打赏
  • 举报
回复
我觉得需要看具体情况。
十八道胡同 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chollima 的回复:]

读就是安全的???
比如:我的容器读用了一个成员变量记录位置,好比多个线程读文件(用同一个文件指针)
引用 12 楼 babilife 的回复:

引用 11 楼 chollima 的回复:
这个给力,回答准确!
我说的仅仅是去读,其实要不要加锁要看内部实现的,如果读的过程中内部有容器实例状态改变就有可能要加锁,所以这个问题的关键是看源码实现。
有些人回答的根本没看到读,讲了同步的……
[/Quote]
这个成员你的每个线程是要写? 写的话就要
十八道胡同 2011-09-03
  • 打赏
  • 举报
回复
只读不需要的
jackyjkchen 2011-09-03
  • 打赏
  • 举报
回复
微软的权威说法,不需要

Answer from MSDN:

The container classes are vector, deque, list, queue, stack, priority_queue, valarray, map, hash_map, multimap, hash_multimap, set, hash_set, multiset, hash_multiset, basic_string, and bitset.

A single object is thread safe for reading from multiple threads. For example, given an object A, it is safe to read A from thread 1 and from thread 2 simultaneously.

If a single object is being written to by one thread, then all reads and writes to that object on the same or other threads must be protected. For example, given an object A, if thread 1 is writing to A, then thread 2 must be prevented from reading from or writing to A.

It is safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type. For example, given objects A and B of the same type, it is safe if A is being written in thread 1 and B is being read in thread 2.
FanTasyCC 2011-09-03
  • 打赏
  • 举报
回复
读就是安全的???
比如:我的容器读用了一个成员变量记录位置,好比多个线程读文件(用同一个文件指针)
[Quote=引用 12 楼 babilife 的回复:]

引用 11 楼 chollima 的回复:
这个给力,回答准确!
我说的仅仅是去读,其实要不要加锁要看内部实现的,如果读的过程中内部有容器实例状态改变就有可能要加锁,所以这个问题的关键是看源码实现。
有些人回答的根本没看到读,讲了同步的一些基本方法,有些人回答的看到读就认为一定不需要,还有几个回答的非常好,谢谢啊!
引用 5 楼 jackyjkchen 的回复:

微软的权威说法,不……
[/Quote]
qunqun2012 2011-09-03
  • 打赏
  • 举报
回复
常量迭代器

和指针一样,你可以给一个迭代器赋值。例如,首先申明一个迭代器:


vector<int>::iterator first; 该语句创建了一个vector<int>类的迭代器。下面的语句将该迭代器设置到intVector的第一个对象,并将它指向的对象值设置为123:


first = intVector.begin(); *first = 123; 这种赋值对于大多数容器类都是允许的,除了只读变量。为了防止错误赋值,可以申明迭代器为:


const vector<int>::iterator result; result = find(intVector.begin(), intVector.end(), value); if (result != intVector.end()) *result = 123; // ???

const迭代器不能修改值, 你能做的就是读数据,不能修改


所以不需要啊



[Quote=引用楼主 chollima 的回复:]
以我现在对vector内部实现的理解,是不需要的,需要高手确认一下,谢谢!
尽量避免加锁的原则(效率原因,我不想加锁)
[/Quote]
tan625747 2011-09-03
  • 打赏
  • 举报
回复
加锁是避免了共享资源的访问安全

像这种情况

vector<int> v;

void fa()
{
。。。
//加锁
v.push_back(1);
}

void fb()
{

。。。
//加锁
v.push_back(1);
}


thread(fa);
thread(fb);
明显要加锁。


要不要加锁,要看vector是不是共享的访问资源。
zmshy2128 2011-09-03
  • 打赏
  • 举报
回复
确定的说:不需要
hurryboylqs 2011-09-03
  • 打赏
  • 举报
回复
只读 不需要加 锁的,当然这个时候不能有写的行为发生
c_340705108 2011-09-03
  • 打赏
  • 举报
回复
back up 12 lay 读是不要枷锁的,如果写的话,要具体问题具体分析
至善者善之敌 2011-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chollima 的回复:]
这个给力,回答准确!
我说的仅仅是去读,其实要不要加锁要看内部实现的,如果读的过程中内部有容器实例状态改变就有可能要加锁,所以这个问题的关键是看源码实现。
有些人回答的根本没看到读,讲了同步的一些基本方法,有些人回答的看到读就认为一定不需要,还有几个回答的非常好,谢谢啊!
引用 5 楼 jackyjkchen 的回复:

微软的权威说法,不需要

Answer from MSDN:
……
[/Quote]

我估计你也没有认真的看~~读是安全的在任何时候
FanTasyCC 2011-09-03
  • 打赏
  • 举报
回复
这个给力,回答准确!
我说的仅仅是去读,其实要不要加锁要看内部实现的,如果读的过程中内部有容器实例状态改变就有可能要加锁,所以这个问题的关键是看源码实现。
有些人回答的根本没看到读,讲了同步的一些基本方法,有些人回答的看到读就认为一定不需要,还有几个回答的非常好,谢谢啊!
[Quote=引用 5 楼 jackyjkchen 的回复:]

微软的权威说法,不需要

Answer from MSDN:

The container classes are vector, deque, list, queue, stack, priority_queue, valarray, map, hash_map, multimap, hash_multimap, set, hash_set, multiset, hash_multis……
[/Quote]

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧