我正在尝试优化我使用基于锁的哈希表的库。 一种方法是用无锁的结构代替这种基于锁的结构。
我发现了一些算法,我决定使用本文在C中实现:Split-ordered lists: lock-free extensible hash tables
问题是这种结构不能保留元素的插入顺序,我需要这个功能有两个原因:
1)获取当前元素的下一个元素(根据插入顺序而不是hashkey顺序),
2)当达到ht中的最大元素数时,替换旧条目(使用新条目)。这是因为我像缓冲区一样使用哈希表,我想修复它的大小。
所以我问你,所有无锁哈希表的实现都受到这种“缺乏插入顺序”问题的困扰?还是有解决方案?
答案 0 :(得分:1)
如果内存不是问题,实现这一点的一种简单方法是使用原子引用。修改将复制内部数据结构,进行更改,然后更新引用。
在一个简单的实现中,这意味着最后一次写入获胜,所有其他写入被“忽略”。对于更复杂的情况,您可以在引用中添加一个锁定结构,以允许对写入操作进行排队。
因此,您需要使用另一个间接级别,但是可以通过一种非常简单的方式来交换数据结构和算法。
由于此方法适用于任何算法,您可以选择保留顺序的算法。