Background
我正在尝试使用 C++ 中的链接方法设计和实现无锁哈希图。每个哈希表单元格都应该包含无锁列表。为了启用调整大小,我的数据结构应该包含两个数组 - 小数组始终可用,较大的数组用于调整大小,当较小的数组不再足够时。当创建较大的数据时,我希望存储在小线程中的数据逐个传输到较大的数据,每当任何线程对数据结构执行某些操作(添加元素,搜索或删除元素(时。传输所有数据时,将移动较大的数组代替较小的阵列,并删除后者。每当需要扩大阵列时,该循环都会重复。
问题
如前所述,每个数组都应该连接单元格中的列表。我正在尝试找到一种方法将值或节点从一个无锁列表转移到另一个列表,以使值在任何(或两个(列表中都可见。需要确保哈希映射中的搜索不会给用户带来漏报。所以我的问题是:
- 这种无锁列表实现是否可行?
- 如果是这样,这种列表和"移动节点/值"操作的一般概念是什么?我会感谢任何伪代码,C++代码或描述它的科学文章。
为了能够在保持无锁进度保证的同时调整数组的大小,您需要使用操作描述符。调整大小开始后,添加一个描述符,其中包含对旧数组和新数组的引用。
在任何操作(添加、搜索或删除(上:
- 添加操作,搜索旧数组,如果元素已经存在,则在返回之前将元素移动到新数组。使用描述符或特殊的 null 值指示元素已被移动,以便其他线程不会再次尝试移动 搜索
- ,搜索旧数组并如上所述移动元素。
- 删除 - 删除也必须先搜索旧阵列。
现在的问题是,您将有一个线程来验证移动是否完成,以便您可以删除描述符并释放旧数组。为了保持锁定自由,您需要让所有活动线程尝试执行此验证,因此它变得非常昂贵。
您可以查看:
- https://dl.acm.org/citation.cfm?id=2611495
- https://dl.acm.org/citation.cfm?id=3210408