免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tesing2009
打印 上一主题 下一主题

[C++] std::map并发时,只在写入的时候加锁,读到时候不加锁会有问题么? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-10-24 15:40 |只看该作者
回复 6# folklore


    对于读写锁,写锁会阻塞后面的所有读么?
  
    否则会因为读并发太多,读锁一直被占用,导致写锁永远获取不到的情况

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
12 [报告]
发表于 2013-10-24 16:55 |只看该作者
回复 7# bruceteen

你是说parallel_for?
    这种所谓的锁只是表面上的支持, 如果你要这么说, VC也“支持”。。。

锁和线程严重依赖于实现平台, 无法做为语言元素加入标准库的。。。
除非给库分等级,也就是说某个平台支持到某级的库为止。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
13 [报告]
发表于 2013-10-24 16:55 |只看该作者
回复 11# tesing2009


    会。。。。

论坛徽章:
0
14 [报告]
发表于 2013-10-24 16:59 |只看该作者
俺记得在哪里看到vc的STL库写着线程安全的,可是,是真的吗?别被骗了,微软这个大坏蛋

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
15 [报告]
发表于 2013-10-24 17:00 |只看该作者
如果map某个锁成为性能瓶颈,
你只能自已实现数据结构,
尽量减小锁的粒度和占有时间。

减小占有时间的例子:
  1. lock();
  2. deleteitem(removeitem());
  3. release();
复制代码
改为:
  1. lock();
  2. item it =removeitem())
  3. release();
  4. deleteitem(it);
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2013-10-24 17:09 |只看该作者
回复 10# tesing2009


    可以想办法避免并发访问map。 不然不可能避免脏数据。

论坛徽章:
0
17 [报告]
发表于 2013-10-24 18:24 |只看该作者
回复 15# folklore


    好的,多谢回答 :)

论坛徽章:
0
18 [报告]
发表于 2013-10-24 19:12 |只看该作者
回复 15# folklore
  1.     lock();
  2.     map<>::iterator itor = mpValue.find(szKey);
  3.     unlock();
  4.    //线程B写入mapValue
  5.    //线程A操作itor
复制代码
还有个问题请教下,如上代码,线程A在获取map的itor后,线程B对这个map进行写入,这时候线程A再访问这个itor,这个itor有可能失效么?
    也就是说,加锁是应该包含线程A整个访问itor的的周期么?
   
   虽然一般不会这样用,通常map直接保存key和对应的数据对象指针,然后直接操作这个数据对象了。没有深入到map里面看,不了解诶。。
   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
19 [报告]
发表于 2013-10-24 19:48 |只看该作者
回复 18# tesing2009


    会失效, Map不支持访问计数。
但可以使用 std::SharedPtr做为Map元素来回避此问题。

论坛徽章:
0
20 [报告]
发表于 2013-10-24 21:38 |只看该作者
回复 19# folklore


    好的,多谢,我得多看点代码了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP