免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5611 | 回复: 5
打印 上一主题 下一主题

多线程共享哈希,对不同的key进行读写,不加锁会不会冲突? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-22 17:55 |只看该作者 |倒序浏览
例如多线程对同一个哈希表进行读写,但只针对不同的key,也许这个key原先不存在,
不对哈希表进行加锁,会不会冲突?

论坛徽章:
0
2 [报告]
发表于 2010-03-22 18:00 |只看该作者
理论上应该不会冲突,但是你怎么进行进程间的通信呢?

论坛徽章:
0
3 [报告]
发表于 2010-03-22 19:14 |只看该作者
例如多线程对同一个哈希表进行读写,但只针对不同的key,也许这个key原先不存在,
不对哈希表进行加锁,会 ...
iceberg77 发表于 2010-03-22 17:55



    perl的hash好像都是变量复制的吧,不是真正的变量sharing.
线程间同步肯定要考虑lock机制,否则谁知道会发生什么事。

论坛徽章:
0
4 [报告]
发表于 2010-03-23 09:15 |只看该作者
用共享内存   读的时候不加锁  写的时候加锁

论坛徽章:
0
5 [报告]
发表于 2010-03-23 10:26 |只看该作者
理论上应该不会冲突,但是你怎么进行进程间的通信呢?
dahe_1984 发表于 2010-03-22 18:00


我的大致思路如下:
程序以daemon形式运行,多线程共享一个任务队列,以及共享一个用于存放处理数据的哈希,任务队列可以看作一个任务ID序列,ID是唯一的,类似于生产者和消费者模型
主线程主体是个死循环,循环开始,往任务队列添加ID,添加完后,开始检测任务队列是否为空,为空的话,对各线程的处理结果进行一次合并,再输出,该次循环结束。
而另外的多个线程则从队列中获取任务ID,根据任务ID处理对应的数据,将处理得到数据更新到共享哈希中。
因为想说用于存放处理数据的哈希,既然多线程处理的是不同的key,考虑加锁的话,似乎会成为瓶颈,但又不清楚不加锁是不是会冲突。。。
这样讲,不知是否能了解个大概。

perl的hash好像都是变量复制的吧,不是真正的变量sharing.
线程间同步肯定要考虑lock机制,否则 ...
兰花仙子 发表于 2010-03-22 19:14


这个是说线程间的hash共享其实是伪共享(使用threads::shared)?如果是伪共享的话,对于我这种情况,似乎不会有影响,因为各线程处理不同的键值。
但没有实现真正的共享,这样的共享似乎没啥意义?

论坛徽章:
0
6 [报告]
发表于 2010-03-23 11:11 |只看该作者
惭愧  以为你是在做进程共享了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP