繁体   English   中英

C#中的无锁优先队列

[英]A lock-free priority queue in C#

我最近一直在寻找有关如何在 C# 中构建无锁优先级队列的信息。 我什至还没有找到任何语言的实现,或者关于这个问题的像样的论文。 我发现几篇论文似乎是副本,或者至少引用了一篇特定的论文,尽管它的名字实际上并不是关于无锁优先队列的论文; 它实际上是一篇关于使用细粒度锁的优先级队列的论文。

我从其他地方收到的答复包括“使用单个线程”和“您不需要它是无锁的”和“这是不可能的”。 这三个回答都是错误的。

如果有人有这方面的信息,我将不胜感激。

一般来说, 自己编写这种代码是一个坏主意

但是,如果您真的想编写这种代码,我说从Eric Lippert 的书(或博客,实际上) (网络存档链接)中获取一页,基本上,您将实现队列,而不是拥有所有对队列进行修改的函数会修改您调用该方法的实例,这些方法返回队列的全新实例

这在语义上类似于System.String用于维护不变性的模式; 所有操作都返回一个新的System.String ,原始未修改。

这样做的结果是您被迫重新分配每次调用时返回的引用。 因为引用的赋值是原子操作,所以不用担心线程安全; 你保证读/写将是原子的。

然而,这将导致最后胜利的局面; 可能对队列进行了多次修改,但只有最后一个分配会保留,而丢失了其他插入队列的内容。

这可能是可以接受的; 如果没有,您必须在引用的分配和读取周围使用同步。 您仍然会有一个无锁优先级队列,但是如果您担心线程安全和维护操作的完整性,那么您除了将同步的关注移到数据结构之外(几乎所有情况下) , 是一件好事,因为它为您提供了细粒度的显式控制)。

多处理器编程的艺术 请参阅第 15 章 - 优先级队列。 本书使用 Java 编写,但可以轻松转换为 C#,因为它们都具有 GC(这对于本书中的大多数实现很重要)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM