Csharp/C#教程:可以锁定(等待)免费双向链表吗?分享


可以锁定(等待)免费双向链表吗?

用C#标签提出这个问题,但是如果可能的话,应该可以使用任何语言。

是否可以使用Interlocked操作实现双向链表以提供无等待锁定? 我想插入,添加和删除,并清除,而不是等待。

一个简单的谷歌搜索将揭示许多无锁双链表。

但是,它们基于primefacesCAS(比较和交换)。

我不知道C#中的操作是多么primefaces,但根据这个网站

https://www.albahari.com/threading/part4.aspx

C#操作只保证读取和写入32位字段是primefaces的。 没有提到CAS。

是的,这是可能的,这是我在C ++中实现类似STL的无锁双链表 。

生成线程以在列表上随机执行操作的示例代码

它需要64位比较和交换才能在没有ABA问题的情况下运行。 此列表仅可用于无锁内存管理器 。

查看第12页的基准测试 。 随着争用的增加,列表的性能与线程数呈线性关系。 该算法支持不相交访问的并行性,因此随着列表大小的增加,争用可以减少。

这是一篇论文 ,描述了一个无锁双链表。

我们提出了一种高效且实用的并发deque的无锁实现,它是不相交并行可访问的,并使用现代计算机系统中可用的primefaces基元。 先前已知的无锁的无锁算法要么基于不可用的primefaces同步原语,要么仅实现function的子集,要么不是为不相交的访问而设计的。 我们的算法基于双向链表,只需要单字比较和交换……

Ross Bencina有一些非常好的链接我刚刚找到了关于“ 关于无锁和无等待算法的一些注释 ”的数字论文和源代码示例。

我不相信这是可能的,因为你不得不一次设置多个参考,并且互锁操作的功率有限。

例如,执行add操作 – 如果要在A和C之间插入节点B,则需要在一个primefaces操作中设置B-> next,B-> prev,A-> next和C-> prev。 联锁无法处理。 预设B的元素甚至没有帮助,因为另一个线程可以决定在准备“B”时进行插入。

在这种情况下,我会更多地关注锁定尽可能细粒度,而不是试图消除它。

阅读脚注 – 他们计划在VS2010的最终版本之前从4.0中提取ConcurrentLinkedList

那你还没有问过怎么做。 但是,如果您可以在c#中执行primefacesCAS,那么这是完全可能的。

事实上,我现在只是在C ++中实现一个双向链接的等待自由列表。

这是描述它的论文。 https://www.cse.chalmers.se/~tsigas/papers/Haakan-Thesis.pdf

并且演示文稿也可能为您提供一些线索。 https://www.ida.liu.se/~chrke/courses/MULTI/slides/Lock-Free_DoublyLinkedList.pdf

在大多数体系结构中,可以为所有可复制数据结构编写无锁算法[1]。 但是很难写出有效的。

我写了一篇由HåkanSundell和Philippas Tsigas为.Net编写的无锁双链表的实现 。 注意,由于这个概念,它不支持primefacesPopLeft。

[1]: Maurice Herlihy:等待自由同步的不可能性和普遍性结果(1988)

FWIW,.NET 4.0正在System.Collections.Concurrent命名空间中添加一个ConcurrentLinkedList,一个线程安全的双向链表。 您可以阅读文档或描述它的博客文章 。

我会说答案是非常严格的“是的,这是可能的 ,但很难”。 为了实现你所要求的,你基本上需要能够将操作编译在一起以确保没有冲突的东西; 因此,为此目的创建一般实施将非常困难,并且仍然会有一些重大限制。 根据精确的需求创建一个特定的实现可能更简单,即使这样,它也不会“简单”。

上述就是C#学习教程:可以锁定(等待)免费双向链表吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1042038.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

精彩推荐