14

是否有实现 IList 的无锁和线程安全的数据结构?

自然,无锁我的意思是一种在.NET中不使用锁定原语而是使用互锁操作/原子操作来实现线程安全的实现......显然在并发数据结构下没有一个......

有没有人看到一个漂浮在周围?

我已经看到了一个在amino-cbbs中实现的java ,称为LockFreeVector ,但到目前为止还没有用于.NET。有任何想法吗?

4

3 回答 3

7

Parallel.For由于整体方法和Parallel.ForEach类方法,Collections.Concurrent 命名空间中可能缺少实现 IList 的 ConcurrentList 。可以说它们可用于将任何列表作为并发处理,以便快速枚举列表并对其项目执行操作。

也许不提供ConcurrentList他们的意思是或认为如果 Parralel.For 无法提供帮助,则需要使用的不是 IList,而是其他类型的集合,例如堆栈或队列,甚至 Bag 甚至 Dictionary

我同意这种设计,因为在多线程条件下必须处理可索引集合听起来很容易出错和糟糕的设计。如果可以随时修改集合并且索引将失效,那么了解项目索引的目的是什么?包包也可以。也可以使用字典,因为它的索引不会通过将项目添加到集合而失效,并且如果您需要并行访问 List,您将获得您的Parralel.For方法

我觉得很奇怪 - http://msdn.microsoft.com/en-us/library/dd381935.aspx在这里我们可以阅读 ConcurrentLinkedList 类,但我在 System.dll 中找不到它,只有 Bag 和 BlockingCollection 在那里。

我还要说,至少有 95% 的可能性是,对于您的问题,两者中的任何一个都是正确的

  1. 并行类方法优于 ConcurrentList
  2. 现有的 Concurrent 集合将是比 ConcurrentList 更好的集合

我还要说,通过不提供 ConcurrentList,他们节省了开发人员,他们会错误地选择 ConcurrentList 来解决他们的问题,避免犯很多错误,并为他们节省大量时间,迫使开发人员使用现有的 Concurrent 集合。

于 2011-02-22T12:27:34.620 回答
7

好吧,我在任何地方都找不到这样的课程;所以我试了一下

ConcurrentList<T>我的课程的源代码可在 GitHub 上找到

它是无锁的、线程安全的(我认为,基于我的单元测试),并且实现了IList<T>.

支持InsertRemoveAt/RemoveClear

我很高兴地发现我的实现(我独立提出)与软件世界中一些受人尊敬的人发布的数据结构非常相似。

有关实现本身的相当简短的讨论,请参阅我最近的博客文章

目前,它根本没有记录,考虑到某些代码有多“棘手”,这有点糟糕:(

无论如何,如果您查看并发现错误或其他问题,请给我一个新的。

无论如何,可能值得您花时间检查一下。如果你这样做,让我知道你的想法。

于 2011-02-25T21:46:47.580 回答
0

想想随机访问(由 暗示IList<T>)如何在多线程环境中工作。如果它是不可变的,您实际上无法真正做任何事情,因为添加和删除,即使它们是原子的,也不要阻止线程 1 删除线程 2 即将检索的索引处的项目。这就是 .NET 2.0+ 中没有 SyncRoot 的原因

于 2011-02-25T21:51:31.860 回答