对于LRU缓存,我需要一个无锁队列的算法,类似于论文Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms中描述的那个
但是为了维护LRU队列,我还需要删除队列中的节点(尾部的节点除外)。
我的想法是只使用CAS操作将节点标记为已删除,然后使用单个清理线程,稍后将从队列中删除已删除的节点。
我发现创建无锁算法比我最初预期的要复杂得多。所以,我的问题是:
是否有可用的此类算法?
这是我目前使用的结构:
一般
入队
出列
删除的
清理帖子
Node.prev用于告诉:
答案 0 :(得分:3)
队列元素的逻辑删除实际上是有问题的,这就是为什么你不会为此找到论文的原因。此外,它是一个非常具体的功能添加到一个非常通用的数据结构,这是你找不到论文的另一个原因;你只会找到一般数据结构的论文。
问题是双重的;首先,队列通常不支持游标。其次,知道访问您希望逻辑删除的元素是否仍然安全 - 例如,它可能已经出列并取消分配吗?
您引用的队列使用指针 - 计数器对来解决ABA,这意味着使用空闲列表。在这种情况下,您始终可以确保元素尚未被释放。
关于游标,您需要在出列处输入,然后沿着队列继续进入入队指针。但是,如果您正在查看的元素在进入下一个元素之前出现了会发生什么?然后,您将跟随已从队列中删除并位于空闲列表中的元素的下一个指针。实际上,一般情况下,任何都可能发生在从一个元素移动到另一个元素的光标之间的队列中 - 包括完全删除队列和使用不同元素进行重新创建。
因此,您需要一个链接列表,它明确支持游标。
你没有提到你正在使用的语言?