社区
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));
请问如果像以上这样多线程运行,应该不需要加锁吧?
...全文
1553
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、值可能会改变
为什么多线程
读写
shared_ptr 要
加锁
?
为什么多线程
读写
shared_ptr 要
加锁
?陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_
golang中
map
并发
读写
问题及解决方法
一、
map
并发
读写
问题 如果
map
由多协程同时读和写就会出现 fatal error:concurrent
map
read and
map
write的错误 如下代码很容易就出现
map
并发
读写
问题 func main(){ c := make(
map
[string]int) go func() {//开一个协程写
map
for j := 0; j
go
map
只是读取不用
加锁
• Go 的
map
是一个引用类型,只要
map
的内容在读取期间保持不变,多个 goroutine 同时读取同一个
map
是安全的。• 例如,一个 goroutine 在读取
map
的同时,另一个 goroutine 正在修改
map
的内容,这可能会导致竞态条件。•
加锁
会引入额外的开销,包括锁的获取和释放。在这个例子中,
map
既有写操作也有读操作,因此
需要
使用`sync.RWMutex`来保护
map
的访问。• 如果
map
在读取期间不会被修改,只读操作是线程安全的,不
需要
加锁
。
Go 1.9 以后
map
并发
读写
的问题,sync.
Map
揭秘
在Go 1.6之前, 内置的
map
类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地
读写
map
会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。 本文带你深入到sync.
Map
的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现s
【Go进阶】怎么实现并发安全的
map
go语言提供的数据类型中,只有channel是并发安全的,基础
map
并不是并发安全的。以下三种方案实现了并发安全的
map
。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章