社区
C++ 语言
帖子详情
对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
打赏
收藏
对map的读写需要加锁么?
读的操作可能有两种 map::iterator iter = xxx.find(*); 或者 ** ptr = xxx; 同时有另外的线程可能会增加值,注意:不会修改也不会删除。 xxx[newKey] = newValue; 或者 xxx.insert(std::make_pair(newKey, newValue)); 请问如果像以上这样多线程运行,应该不需要加锁吧?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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万的访问,加锁与否,影响不小吧?
高性能架构探索
2011-12-08
打赏
举报
回复
[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、值可能会改变
Golang实现对
map
的并发
读写
的方法示例
在Golang多协程的情况下使用全局
map
时,如果不做线程同步,会出现panic的情况。 为了解决这个问题,通常有两种方式: 第一种是最常见的使用互斥锁或者
读写
锁的方法; 第二种是比较符合Golang特色的方法,启动单个协程对
map
进行
读写
,当其他协程
需要
读写
map
时,通过channel向这个协程发送信号即可。 写了一个模拟程序对
map
中的一项进行读或者写,后台一直运行的协程阻塞的接受
读写
信号,并对
map
进行操作,但是读操作的时候没想好怎么返回这个值。 后来想到用传引用的方式,定义结构体,第一个参数是
读写
的标志,第二个参数是读成功或者写成功后的值的channel,定义的channe
深度解密 Go 语言中的 sync.
map
工作中,经常会碰到并发
读写
map
而造成 panic 的情况,为什么在并发
读写
的时候,会 panic 呢?因为在并发
读写
的情况下,
map
里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。 是什么 Go 语言原生
map
并不是线程安全的,对它进行并发
读写
操作的时候,
需要
加锁
。而 sync.
map
则是一种并发安全的
map
,在 Go 1.9 引入。 sync.
map
是线程安全的,读取,插入,删除也都保持着常数级的时间复杂度。 sync.
map
的零值是有效的,并且零值是一个空的
map
。在第一次使用之后,不允许被拷贝。 有什么用
【JUC并发编程】3 ConcurrentHash
Map
的get()方法真的不
需要
加锁
吗?
一、前言 我们都知道,ConcurrentHash
map
这个并发集合框架是线程安全的,当我们看get()方法的源码时,会发现get操作全程没有
加锁
。但是真的是这样的吗?本文我们就深入的看看它为什么大家都说它不
需要
加锁
?是不是真的不
需要
加锁
?留个悬念,在一种特殊场景下是要
加锁
的。 二、ConCurrentHash
Map
#get()方法 1、流程: 使用扰动函数计算key的hash值,取到其所在的数组下标位置。 如果节点是首节点,直接返回。 如果节点的hash值eh是负值,说明ConCurrentHashMa
C++多线程
map
读写
加锁
# C++多线程代码参考 定义线程函数 用
map
接受线程返回数据 void threadClsTask(int begin, int end, vector<Mat> imgList, BSMobileNet *bsMobileNet,
map
<int, int> *bsInfo){ int clsRes = bsMobileNet->inference(im...
Java
map
都
需要
加锁
吗_70%的Java程序员不知道为啥 ConcurrentHash
Map
读操作不
需要
加锁
?...
目录1.ConcurrentHash
Map
的简介2.get操作源码3.volatile登场4.是加在数组上的volatile吗?5.用volatile修饰的Node6.总结我们知道,ConcurrentHash
map
(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不
需要
加锁
呢?ConcurrentHash...
C++ 语言
64,641
社区成员
250,579
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章