Concurrency 在无锁列表之间移动值 背景 我试图用C++中的链式方法来设计和实现无锁的哈希图。每个哈希表单元都应该包含无锁列表。为了能够调整大小,我的数据结构应该包含两个数组——一个小数组总是可用,另一个大数组用于调整大小,当小数组不再足够时。当创建较大的数据结构时,我希望存储在较小数据结构中的数据能够一个接一个地传输到较大的数据结构中,无论何时任何线程对数据结构进行操作(添加元素、搜索或删除元素)。传输所有数据时,将移动较大的数组而不是较小的数组,并删除较小的数组。只要阵列需要放大,循环就会重复 问题

Concurrency 在无锁列表之间移动值 背景 我试图用C++中的链式方法来设计和实现无锁的哈希图。每个哈希表单元都应该包含无锁列表。为了能够调整大小,我的数据结构应该包含两个数组——一个小数组总是可用,另一个大数组用于调整大小,当小数组不再足够时。当创建较大的数据结构时,我希望存储在较小数据结构中的数据能够一个接一个地传输到较大的数据结构中,无论何时任何线程对数据结构进行操作(添加元素、搜索或删除元素)。传输所有数据时,将移动较大的数组而不是较小的数组,并删除较小的数组。只要阵列需要放大,循环就会重复 问题,concurrency,parallel-processing,lock-free,Concurrency,Parallel Processing,Lock Free,如前所述,每个数组都应该包含单元格中的列表。我试图找到一种方法,将一个值或节点从一个无锁列表转移到另一个无锁列表,以使值在任何(或两个)列表中都可见。需要确保哈希映射中的搜索不会给用户错误的否定。因此,我的问题是: 这样的无锁列表实现是否可行 如果是,这种列表和“移动节点/值”操作的一般概念是什么?我会感谢任何伪代码,C++代码或科学文章描述它。 为了能够调整数组大小,同时保持无锁进度保证,您需要使用操作描述符。一旦开始调整大小,添加一个描述符,其中包含对旧数组和新数组的引用 在任何操作(添加、

如前所述,每个数组都应该包含单元格中的列表。我试图找到一种方法,将一个值或节点从一个无锁列表转移到另一个无锁列表,以使值在任何(或两个)列表中都可见。需要确保哈希映射中的搜索不会给用户错误的否定。因此,我的问题是:

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

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

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

    • 添加操作,搜索旧数组,如果元素已经存在,则在返回之前将元素移动到新数组。使用描述符或特殊的空值指示元素已被移动,以便其他线程不再尝试移动
    • 搜索,搜索旧数组并移动元素,如上所示
    • Remove-Remove也必须首先搜索旧数组
    现在的问题是,您将有一个线程必须验证移动是否完成,以便您可以删除描述符并释放旧数组。要保持锁自由,您需要让所有活动线程都尝试执行此验证,因此这将非常昂贵

    你可以看看:


    我不认为这个问题是C++特有的,所以我删除了标签。即使有一些C和C++并行性问题(比如内存管理)