首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中的一种无锁优先级队列

C#中的一种无锁优先级队列
EN

Stack Overflow用户
提问于 2011-05-15 09:35:11
回答 2查看 2.2K关注 0票数 8

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

我从其他地方收到的回应包括“使用单线程”、“你不需要它是无锁的”和“这是不可能的”。这三种回答都是不正确的。

如果有人有关于这方面的信息,我将非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-15 09:44:17

一般来说,它是一个bad idea to write this kind of code yourself

但是,如果你真的想写这样的代码,我说从Eric Lippert's book (or blog, as it were) (web archive link)中拿出一个页面,基本上,你可以实现队列,但不是让所有在队列上进行修改的函数修改你调用方法的实例,这些方法返回队列的全新实例。

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

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

但是,这将导致最后获胜的情况;有可能对队列进行了多次修改,但只有最后一个赋值有效,从而丢失了队列中的其他插入。

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

票数 5
EN

Stack Overflow用户

发布于 2011-05-15 09:42:47

The Art of Multiprocessor Programming。请参阅第15章-优先级队列。Book是用Java语言编写的,但是可以很容易地转换为C#,因为它们都有GC (这对于书中的大多数实现都很重要)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6005935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档