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

时间:2009-05-11 19:57:41

标签: c# thread-safety locking lock-free interlocked

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

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

9 个答案:

答案 0 :(得分:16)

是的,这是可能的,这是我在C ++中实现类似STL的Lock-Free Doubly-Linked List

Sample code that spawns threads to randomly perform ops on a list

它需要64位比较和交换才能在没有ABA问题的情况下运行。此列表仅可能因lock-free memory manager

而生效

查看benchmarks on page 12。随着争用的增加,列表的性能与线程数呈线性关系。该算法支持不相交访问的并行性,因此随着列表大小的增加,争用可能会减少。

答案 1 :(得分:11)

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

但是,它们基于原子CAS(比较和交换)。

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

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

C#操作只能保证读取和写入32位字段的原子性。没有提到CAS。

答案 2 :(得分:4)

这是一个paper,它描述了一个无锁双链表。

  

我们提出了一种有效和实用的方法   无锁执行   并发deque即   不相交并行可访问和使用   可用的原子基元   在现代计算机系统中。先前   已知无锁的deques算法   要么基于不可用   原子同步原语,   只实现了一个子集   功能,或不是为...而设计的   不相交的访问。我们的算法是   基于双重链表,和   只需要单字   比较并交换...

罗斯·本西纳(Ross Bencina)有一些非常好的链接,我刚刚找到了“Some notes on lock-free and wait-free algorithms”的数字论文和源代码示例。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

嗯,你实际上并没有问过怎么做。但是,如果您可以在c#中执行原子CAS,那么这是完全可能的。

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

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

这个演讲也可能为你提供一些线索。 http://www.ida.liu.se/~chrke/courses/MULTI/slides/Lock-Free_DoublyLinkedList.pdf

答案 6 :(得分:1)

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

我为.Net写了implementation lock-free doubly linked list by Håkan Sundell and Philippas Tsigas。请注意,由于概念,它不支持原子PopLeft。

[1]:Maurice Herlihy: Impossibility and universality results for wait-freesynchronization (1988)

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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