我一直在搜索并发链表实现/学术论文,允许并发插入列表中不相交的位置。我更喜欢基于锁的方法。
不幸的是,到目前为止我检查过的所有实现都使用基于列表的锁定,而不是类似于基于节点的锁定。
有人帮忙吗?
编辑1:感谢所有人的初步回复。使用基于节点的锁定意味着对于在节点之后插入或删除节点,我需要锁定前一个节点和下一个节点。现在完全可能的是,当线程1试图锁定前一个节点时,它在线程2中被删除了。如何防范此类事故?
答案 0 :(得分:4)
我无法推荐任何专门针对C执行此操作的库,但是如果您最终自己完成此操作,则可以通过重新使用少量锁和一些“哈希”来避免必须拥有数千个锁“决定每个节点使用哪个。如果锁的数量适当地大于空间开销很小的节点数(并且它是固定的,而不是每个节点),那么你会遇到很多没有任何争用的情况。
更新,对于编辑1
您可以通过使用每个列表的多个读取器,单个写锁定(rwlock)解决此问题,在获取插入的每个节点锁之前获取“读取”锁定,但是删除你需要获得单个“写”锁。您可以非常轻松地避免读取/插入操作的不必要的同步问题,并且删除非常简单。 (假设删除比插入更少见)
答案 1 :(得分:1)
您可能希望查看使用无锁实现。想法是在插入/删除节点时使用原子测试集操作。
不幸的是,没有很多广为人知的实现。你可能需要自己动手。以下是关于原子操作支持的gcc文档:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
答案 2 :(得分:0)
基于节点的锁定的问题在于,您通常必须为每次插入锁定两个节点。在某些情况下,这可能会更贵。
更糟糕的是,你得到了餐饮哲学家类似的死锁可能性你必须要对待。
因此,基于列表的锁定更容易,这就是为什么你会看到更多关于这些的信息。
如果基于列表的锁定的性能特征不利于您的应用程序,请考虑更改为与单个链接列表不同的数据结构。