我正在尝试使用C ++中的链接方法来设计和实现无锁哈希表。每个哈希表单元格都应包含无锁列表。为了实现调整大小,我的数据结构应该包含两个数组-小数组始终可用,大数组用于调整大小,而较小的数组不再足够。创建一个较大的数据时,我希望每当任何线程对数据结构进行某些操作(添加元素,搜索或删除一个数据)时,都将存储在较小数据中的数据一张一张地传输。传输所有数据后,将较大的阵列移至较小的阵列,然后删除后者。每当需要扩大数组时,循环就会重复。
如前所述,每个数组应该包含单元格中的列表。我正在尝试找到一种方法,将值或节点从一个无锁列表转移到另一个列表,以使值在任何(或两个)列表中可见。需要确保在哈希映射中进行搜索不会给用户带来负面的负面印象。所以我的问题是:
答案 0 :(得分:1)
为了能够调整数组的大小,同时保持无锁进度保证,您将需要使用操作描述符。调整大小开始后,添加一个描述符,该描述符包含对旧数组和新数组的引用。
在任何操作(添加,搜索或删除)上:
现在的问题是,您将拥有一个线程,该线程必须验证移动是否完成,以便可以删除描述符并释放旧数组。为了保持无锁状态,您将需要所有活动线程尝试进行此验证,因此这非常昂贵。
您可以查看: