免费注册 查看新帖 |

Chinaunix

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

[C] 如何使两个进程操作同一个链表? [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
11 [报告]
发表于 2013-10-14 11:11 |只看该作者
通过消息共享内存, 而不是共享内存来传递消息。

论坛徽章:
1
水瓶座
日期:2013-10-14 10:55:54
12 [报告]
发表于 2013-10-14 11:13 |只看该作者
为什么不用多线程呢?

论坛徽章:
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
13 [报告]
发表于 2013-10-14 11:15 |只看该作者
回复 11# linux_c_py_php


    linux_c_py_php大神,我不是很明白

     即使通过共享内存能读到消息,也没有办法访问另一个进程malloc的空间不是吗?

论坛徽章:
0
14 [报告]
发表于 2013-10-14 11:16 |只看该作者
archer239915 发表于 2013-10-14 11:13
为什么不用多线程呢?


多线程并不能解决问题。还是一个进程负责链表管理,其他进程通过消息队列和负责管理的进程通信比较好。

论坛徽章:
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
15 [报告]
发表于 2013-10-14 11:19 |只看该作者
回复 12# archer239915


    进程内部已经是多线程了,如果全是多线程的话我肯定早就晕菜了

论坛徽章:
1
水瓶座
日期:2013-10-14 10:55:54
16 [报告]
发表于 2013-10-14 11:20 |只看该作者
喔     我一般用两个线程共享链表什么的,好像好搞一些,   用两个进程感觉共享和同步方面都复杂一些

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2013-10-14 16:11 |只看该作者
允许用锁吗? 感觉不用锁的话,要让两个进程在同一段内存上操作链表这种数据结构难度相当大啊,脏数据在两个进程间同步很麻烦,尤其现在都是多核的情况下。

论坛徽章:
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
18 [报告]
发表于 2013-10-16 09:26 |只看该作者
回复 17# csumck


    用的信号量,其实是一个进程不断往链表末尾加,另一个从链表头上取

    虽然操作的是同一个链表,但不是同一个位置

    不管用锁也好,用别的什么也好,请教csumck大神,您是曾经实现过类似的东西吗?求帮助~谢谢

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
19 [报告]
发表于 2013-10-16 16:19 |只看该作者
这种问题, 分片, 然后加proxy.

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


    我没实现过,我们公司有个同事经常用共享内存操作map和list这种数据结构,而且他是不加锁的,但是他允许脏数据存在,他的基本思路就是开一块大内存,所有的操作都在这块内存上进行,指针都用偏移量来表示(比如链表的head节点为10,表示内存块上第10号位置的结点)。所有的单元有个是否占用的标志位,申请单元格时就随便找一块单元把标志位置1。 遍历的时候就从内存最开始挨着遍历,遍历到标志位是1的就是有效节点。 他这个方法如果只有1个writer进程那就,那其他reader读到的数据就基本是正确的。如果writer进程少的话极少碰到同时申请到同一个单元的情况,即使碰到的话也不会引起崩溃,只是数据不太可靠了。 如果writer进程太多,這個方法就不适用了。

    你如果允许用信号量加锁了,那用这个思路肯定就没问题了,你甚至可以把有效节点用偏移量串起来方便遍历。就是注意在加锁后、解锁前使用memory barrier把各CPU的cache同步一下就可以了。

    不过说实话,这种方法个人感觉不是很靠谱,只能是本机多进程,如果要跨机器就不行了,而且需要维护共享内存。如果解决问题时要用到这种办法了,真的要考虑下是不是值得,是不是要换种思路。最灵活的办法还是进程间通过消息各自在本地维护数据,或者需要数据时去别处取。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP