我最近一直在搜索有关如何在C#中构建无锁优先级队列的信息。我甚至还没有找到任何语言的实现,或者关于这个问题的正确论文。我发现有几篇论文似乎是复制品,或者至少引用了一篇特定的论文,这篇论文实际上并不是一篇关于无锁优先级队列的论文,尽管它的名字不同;它实际上是一个使用细粒度锁的优先级队列的文章。
我从其他地方收到的回复包括“使用单个帖子”和“你不需要它免费锁定”和“这是不可能的”。所有这三个答案都是不正确的。
如果有人对此有一些信息,我将不胜感激。
答案 0 :(得分:5)
通常,它是bad idea to write this kind of code yourself。
但是,如果确实想要编写这种代码,我说从Eric Lippert's book (or blog, as it were)获取一个页面,基本上,你将实现队列,而不是拥有所有的功能对队列进行修改会修改您调用方法的实例,这些方法会返回队列的全新实例。
这在语义上类似于System.String
用于维持不变性的模式;所有操作都返回一个新的System.String
,原始版本不会被修改。
这样做的结果是您被迫重新分配每次通话时返回的引用。因为引用的赋值是原子操作,所以不关心线程安全性;保证读/写将是原子的。
然而,这将导致最后一次胜利的情况;可能会对队列进行多次修改,但只有最后一次分配会保留,而其他插入会丢失到队列中。
这可能是可以接受的;如果没有,则必须围绕赋值和读取引用使用同步。您仍将拥有无锁优先级队列,但如果您担心线程安全并保持操作的完整性,那么除了移动数据结构之外的同步问题之外什么也没做(几乎所有情况都是如此) ,这是一件好事,因为它为您提供了细粒度的显式控制。)
答案 1 :(得分:3)
The Art of Multiprocessor Programming。请看第15章 - 优先级队列。本书是用Java编写的,但可以很容易地翻译成C#,因为它们都有GC(这对本书中的大多数实现都很重要)。