在无锁列表之间移动值

时间:2018-10-16 18:21:42

标签: concurrency parallel-processing lock-free

背景

我正在尝试使用C ++中的链接方法来设计和实现无锁哈希表。每个哈希表单元格都应包含无锁列表。为了实现调整大小,我的数据结构应该包含两个数组-小数组始终可用,大数组用于调整大小,而较小的数组不再足够。创建一个较大的数据时,我希望每当任何线程对数据结构进行某些操作(添加元素,搜索或删除一个数据)时,都将存储在较小数据中的数据一张一张地传输。传输所有数据后,将较大的阵列移至较小的阵列,然后删除后者。每当需要扩大数组时,循环就会重复。

问题

如前所述,每个数组应该包含单元格中的列表。我正在尝试找到一种方法,将值或节点从一个无锁列表转移到另一个列表,以使值在任何(或两个)列表中可见。需要确保在哈希映射中进行搜索不会给用户带来负面的负面印象。所以我的问题是:

  1. 这样的无锁列表实现可能吗?
  2. 如果是这样,这种列表和“移动节点/值”操作的一般概念是什么?感谢任何伪代码,C ++代码或描述它的科学文章。

1 个答案:

答案 0 :(得分:1)

为了能够调整数组的大小,同时保持无锁进度保证,您将需要使用操作描述符。调整大小开始后,添加一个描述符,该描述符包含对旧数组和新数组的引用。

在任何操作(添加,搜索或删除)上:

  • 添加操作,搜索旧数组,如果元素已经存在,则在返回之前将元素移至新数组。使用描述符或特殊的null值指示该元素已被移动,以使其他线程不会再次尝试移动
  • 搜索,搜索旧数组并按照上述指示移动元素。
  • 删除-删除也必须首先搜索旧数组。

现在的问题是,您将拥有一个线程,该线程必须验证移动是否完成,以便可以删除描述符并释放旧数组。为了保持无锁状态,您将需要所有活动线程尝试进行此验证,因此这非常昂贵。

您可以查看:

相关问题