读书人

多进程下的Hash,该如何解决

发布时间: 2012-02-24 16:30:38 作者: rapoo

多进程下的Hash
我想设计一个Hash数据结构,只有一个进程会进行添加,修改,删除。但会有多个进程对它进行查询。
查询的时候是可以允许查到少量更新前的结果,也就是不需要非常的实时,但查出来的结果不能是有错误的。但是设计要求不允许用文件锁或是记录锁之类的锁。
我现在想的差不多了,但就是HashNode中保存的数据是一个结构体,我在删除的时候不能在一条计算机指令内完成删除操作,所以我想会出现写进程刚删除了一半,读进程把删除了一半的这种结构体数据给读进去了,就麻烦了。

希望大家给点建议,最好是能推荐点文章,中英文都行,Lock Free内容的就算了吧,我汇编真的是写不出来。

[解决办法]
RCU技术,需要哈希表的每个槽位是个链表节点。即链表法解决冲突。

每个reader需要将node内容做一个copy再使用。

每个writer的动作,假设原来的hash表里某一项是
槽位head->a->b->c
即里面有3个节点,a、b、c,现在要更新b
步骤:
1》new一个节点d,将b的内容拷贝至d,注意,这时候d的next指针指向c
2》更新d的值
3》将a的next指针指向d
4》在适当的时机释放b的内存,这是因为可能在更新时有reader正在用,如果可以估计reader的最大使用时间,那么可以在这个时间之后free掉b。

x86架构保证指针赋值是在一条指令里完成的。也就是说,a的next指针从b切换到d不会有中断。

读书人网 >软件架构设计

热点推荐