有没有一种无锁且线程安全的数据结构可以实现IList?
自然地,我指的是在.NET中没有使用锁原语,而是使用交换操作/原子操作来实现线程安全的实现...
显然,在并发数据结构中似乎没有这样的数据结构...
有人看到过这样的数据结构吗?
我看到一个Java实现的amino-cbbs,称为LockFreeVector,但目前还没有.NET版本。
有什么想法吗?
有没有一种无锁且线程安全的数据结构可以实现IList?
自然地,我指的是在.NET中没有使用锁原语,而是使用交换操作/原子操作来实现线程安全的实现...
显然,在并发数据结构中似乎没有这样的数据结构...
有人看到过这样的数据结构吗?
我看到一个Java实现的amino-cbbs,称为LockFreeVector,但目前还没有.NET版本。
有什么想法吗?
由于整个Parallel.For
和Parallel.ForEach
类方法,可能在Collections.Concurrent命名空间中缺少实现IList的ConcurrentList。有人可以说,它们可以用来处理任何列表作为Concurrent,以便快速枚举列表并对其项执行操作。
也许通过不提供ConcurrentList
,他们意味着或认为如果Parralel.For无法帮助,则需要使用不是IList而是其他类型的集合,如堆栈或队列甚至Bag或Dictionary
我同意这种设计,因为在多线程条件下处理可索引集合听起来很容易出错和糟糕的设计。如果集合随时可以修改并且索引将无效,那么知道项的索引的目的是什么,在存在多个读取器 - 写入器的情况下,对我来说很明显Queue或Stack将是常用的最适合的集合,或者Bag也可以很好地使用。字典也可以使用,因为添加项目到集合不会使其索引无效,如果您需要并行访问列表,则可以使用Parralel.For
方法
我认为你的问题至少有95%的概率符合以下两种情况之一:
我还要说的是,通过不提供ConcurrentList,他们为那些错误地选择ConcurrentList来解决问题的开发者节省了时间,并避免了许多错误,迫使开发者使用现有的Concurrent集合。
我在其他地方无法找到这样的类,所以我自己试着写了一个。
我的ConcurrentList<T>
类的源代码可以在GitHub上获取。
它是无锁的、线程安全的(基于我的单元测试,我认为是这样的),并实现了IList<T>
。
它不支持Insert
、RemoveAt
/Remove
或Clear
。
令我高兴的是,我独立开发的实现与一些软件界内备受尊敬的人士发布的数据结构非常相似。
关于实现本身的简短讨论,请参见我最近的博客文章。
目前,它没有任何文档,考虑到一些代码有多么“棘手”,这有点糟糕:(
如果你看了一眼并发现了错误或其他问题,请务必指出。
无论如何,检查一下可能值得你的时间。如果你这样做了,请告诉我你的想法。
想象一下在多线程环境下如何使用随机访问(由 IList<T>
隐含)可能会出现的情况。如果添加和删除即使是原子操作,也不能真正地做到不可变性,因为它们无法防止第一个线程删除线程2刚要检索的索引处的项目。这就是为什么在 .NET 2.0+ 中 SyncRoot 的东西被移除的原因。
List<T>
是相当无锁的。您还应该澄清您所说的“无锁”的含义。 - John SaundersLockFreeVector<E>
并没有随机Insert
操作(这是IList<T>
接口的一部分)。 - Dan Tao