对map的读写需要加锁么?

yangyunzhao 2011-12-08 05:50:15
读的操作可能有两种

map<*,*>::iterator iter = xxx.find(*);

或者 ** ptr = xxx
  • ;

    同时有另外的线程可能会增加值,注意:
  • 不会修改也不会删除

    xxx[newKey] = newValue;

    或者 xxx.insert(std::make_pair(newKey, newValue));


    请问如果像以上这样多线程运行,应该不需要加锁吧?
...全文
1399 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iblold 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangyunzhao 的回复:]
引用 5 楼 iblold 的回复:

map是基于红黑树的,插入时可能会进行旋转操作
所以插入和读取在不同线程的话,必须加锁

如果对效率要求较高,可以使用环形buffer,在只有读写两线程的情况下
环形buffer无需加锁

一个写线程,N个读线程
[/Quote]

一写多读可以用空间来换时间,为每个读线程创建一个环形buffer
这样对每个buffer来说都是两线程操作了
qq120848369 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangyunzhao 的回复:]

引用 5 楼 iblold 的回复:

map是基于红黑树的,插入时可能会进行旋转操作
所以插入和读取在不同线程的话,必须加锁

如果对效率要求较高,可以使用环形buffer,在只有读写两线程的情况下
环形buffer无需加锁

一个写线程,N个读线程
[/Quote]

读写锁.
gw_net 2011-12-08
  • 打赏
  • 举报
回复
if map is global, you need
Snight 2011-12-08
  • 打赏
  • 举报
回复
首先容器不是线程安全的,两个线程均会改变容器内容的话, 锁是必须加的

“同时有另外的线程可能会增加值,注意:不会修改也不会删除。”

如你所言, 增加, 修改, 删除...这三个操作, 只有修改,是相对线程安全的(允许脏读的情况下)。

你说了另外的线程会“增加”值,那么容器内存就是被修改的,迭代器有可能失效的,崩溃是偶发的,想避免的话,锁是少不了的。

yangyunzhao 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iblold 的回复:]

map是基于红黑树的,插入时可能会进行旋转操作
所以插入和读取在不同线程的话,必须加锁

如果对效率要求较高,可以使用环形buffer,在只有读写两线程的情况下
环形buffer无需加锁
[/Quote]
一个写线程,N个读线程
yangyunzhao 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq120848369 的回复:]

加锁不会累死你.
[/Quote]
每秒上10万的访问,加锁与否,影响不小吧?
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq120848369 的回复:]
加锁不会累死你.
[/Quote]
+10086
qq120848369 2011-12-08
  • 打赏
  • 举报
回复
加锁不会累死你.
iblold 2011-12-08
  • 打赏
  • 举报
回复 1
map是基于红黑树的,插入时可能会进行旋转操作
所以插入和读取在不同线程的话,必须加锁

如果对效率要求较高,可以使用环形buffer,在只有读写两线程的情况下
环形buffer无需加锁
vilnies 2011-12-08
  • 打赏
  • 举报
回复
迭代器失效会由 容器 添加或者删除操作引起。你的有另一个线程可能执行插入数据,所以要
加锁。
yangyunzhao 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

需要
1、迭代器可能会失效
2、值可能会改变
[/Quote]

1、插入不会使迭代器失效吧? 那这样呢** ptr = xxx
  • ;这样没有使用迭代器吧
    2、我已经设定前提,不会修改值。
yaohua1210 2011-12-08
  • 打赏
  • 举报
回复
多线程读写需要!
ouyh12345 2011-12-08
  • 打赏
  • 举报
回复
需要
1、迭代器可能会失效
2、值可能会改变

64,641

社区成员

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

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