代码之家  ›  专栏  ›  技术社区  ›  bartop

在无锁列表之间移动值

  •  2
  • bartop  · 技术社区  · 6 年前

    背景

    如前所述,每个数组都应该包含单元格中的列表。我试图找到一种方法,将一个值或节点从一个无锁列表传输到另一个列表,这种方式可以保持值在任何(或两个)列表中可见。它需要确保哈希图中的搜索不会给用户带来误报。所以我的问题是:

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

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

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

    • 搜索,搜索旧数组并按上面所示移动元素。
    • 旧的数组必须先删除。

    现在的问题是,您将有一个线程来验证移动是否完成,这样您就可以删除描述符并释放旧数组。为了维护锁自由度,您需要让所有活动线程都尝试执行此验证,因此这将变得非常昂贵。