可以锁定(等待)自由双向链表吗?用C#标签问这个问题,但如果可能的话应该可以使用任何语言。是否可以使用互锁操作实现双向链表以提供无等待锁定?我要插入,增删改查,不要等待。一个简单的谷歌搜索将显示许多无锁双向链表。但是,它们基于primefacesCAS(比较和交换)。我不知道C#中的原语操作是怎样的,但根据这个网站http://www.albahari.com/threading/part4.aspxC#操作只能保证是读写32位字段的原语。没有提到CAS。是的,这是可能的,这是我在C++中实现的类似STL的无锁双向链表。生成线程以在列表上随机执行操作的示例代码它需要64位比较和交换才能在没有ABA问题的情况下运行。此列表仅适用于无锁内存管理器。查看第12页上的基准测试。随着争用的增加,列表的性能与线程数呈线性关系。该算法支持不相交访问的并行性,因此随着列表大小的增加可以减少争用。这是一篇描述无锁双向链表的论文。我们提出了一种高效实用的并发双端队列的无锁实现,它可以不连续地并行访问,并使用现代计算机系统中可用的原语原语。以前已知的无锁算法要么基于不可用原语同步原语,只实现了功能的一个子集,要么不是为不相交访问而设计的。我们的算法基于双向链表,只需要单字比较和交换......RossBencina有一些非常好的链接我刚刚在“无锁和无等待算法的一些说明”上找到了一些论文和源代码示例”。我认为这是不可能的,因为您必须一次设置多个引用,并且联锁操作的功能有限。例如,执行添加操作——如果要在A和C之间插入节点B,则需要在一次基元操作中设置B->next、B->prev、A->next和C->prev。无法处理互锁。B的预设元素甚至没有帮助,因为另一个线程可能会在准备“B”时决定进行插入。在这种情况下,我会更多地关注尽可能细粒度的锁定,而不是试图消除它。阅读脚注-他们计划在VS2010的最终版本之前从4.0中提取ConcurrentLinkedList而你还没有问过如何做到这一点。但是,如果您可以在C#中执行primefacesCAS,那么这是完全可能的。事实上,我现在正在用C++实现一个双向链接的无等待列表。这是描述它的论文。http://www.cse.chalmers.se/~tsigas/papers/Haakan-Thesis.pdf并且演示文稿也可能会给您一些线索。http://www.ida.liu.se/~chrke/courses/MULTI/slides/Lock-Free_DoublyLinkedList.pdf在大多数架构上,可以为所有可复制数据结构编写无锁算法[1]。但是很难写出高效的。我为.Net编写了一个无锁双向链表的实现,作者是H?kanSundell和PhilippasTsigas。请注意,由于这个概念,它不支持primefacesPopLeft。[1]:MauriceHerlihy:TheImpossibilityandUbiquityofWaitingforFreeSynchronizationResults(1988)FWIW,.NET4.0在System.Collections.Concurrent命名空间中添加了一个线程安全的双向链表ConcurrentLinkedList。您可以阅读描述它的文档或博客文章。我会说答案是非常严格的“是的,这是可能的,但很难”。为了实现您的要求,您基本上需要一些可以将操作编译在一起以确保没有冲突的东西;因此,为此目的创建一个通用的实现将非常困难,并且仍然会有一些重大的局限性。根据您的精确需求创建特定的实现可能会更简单,即使那样,它也不会“简单”。以上是C#学习教程:Canyoulock(wait)afreedoublelinkedlist?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
