免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2533 | 回复: 4

[C++] 请教一个多线程读写的问题 [复制链接]

论坛徽章:
0
发表于 2014-11-22 17:12 |显示全部楼层


想实现一个多个线程读一个线程写的共享数据(不用pthread_mutex_t锁机制),设计如下:

1)共享数据放在一个map里叫A,这个map有一个克隆B;

2)读线程通过map的一个指针p来找到它,然后读取,比如此时p = &A;(按C++的STL设计,多线程读取不需要锁,也是线程安全)

3)写线程通过维护B来增减共享数据的元素,在其准备妥当后,用p = &B切换到克隆上,然后把B复制给A,下次维护A;(此时是单线程,也不需要锁)

那么问题来了:
写线程在p = &B这个切换动作时(覆盖了原来的指向&A),是否影响读线程?
我想象着,这个操作如此“原子”,应该不会影响,就算这时候读线程拿到的指向还是&A,大不了还在原map上搜索。

当然这时候又来了另一个问题:
A被切换之后,什么时候才能确认已没人使用了?采用用B覆盖用作下次维护的基础。

设计这个是因为线程的锁机制真挺影响性能,:)

论坛徽章:
0
发表于 2014-11-22 18:34 |显示全部楼层
有点没理解,你的意思是,写的时候先对b加节点,然后同步到a吗?然后读的话只读a?
是否是只增加不删除,就是怕本来读到了一个节点,同步的时候,给删掉了。

btw,这个设计是你自己想出来的吗,还是有成功的案例,一般的生产者消费模型好像都得上锁。是做server吗?

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-11-22 19:09 |显示全部楼层
这样设计存在问题的,假设写很频繁,读很慢,AB都切换一轮了,读还没完,就出问题了。
还是用读写锁吧

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
发表于 2014-11-22 20:30 |显示全部楼层
感觉你这个设计还不如用锁简单
况且这么做肯定是有问题的

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
发表于 2014-11-27 00:23 |显示全部楼层
可以
你这个模型里面两个map不会释放,那还比较好办
在map里放个计数器就可以了
使用+1备用+0
读前+1读完-1
读前要确认计数不为0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP