是否有无锁&实现IList的线程安全数据结构?
当然,无锁是指一种实现,它不使用.NET中的锁定原语,而是使用互锁操作/原子操作来实现线程安全...... 没有一个,显然是在并发数据结构下......
有没有人看到一个漂浮在周围?
我见过一个在amino-cbbs中实现的java,名为LockFreeVector,但到目前为止还没有.NET。 有什么想法吗?
答案 0 :(得分:6)
好吧,我无法在任何地方找到这样的课程;所以 I gave it a shot 。
我的ConcurrentList<T>
课程的源代码是available on GitHub。
它是无锁,线程安全的(我认为,基于我的单元测试),并实现IList<T>
。
不支持Insert
,RemoveAt
/ Remove
或Clear
。
我很高兴地发现我的实现(我独立提出)与软件世界中的数据结构published by some well-respected minds非常相似。
有关实施本身的相当简短的讨论,请参阅my recent blog post。
目前,它根本没有记录,考虑到某些代码的“棘手”,这有点不好:(
如果你看看并发现错误或其他问题,请务必翻新我。
无论如何,你可能值得花时间去看看。如果你这样做,请告诉我你的想法。
答案 1 :(得分:5)
由于整个Parallel.For
和Parallel.ForEach
类方法,Collections.Concurrent命名空间中可能缺少实现IList的ConcurrentList。可以说它们可以用来处理任何列表作为Concurrent,以便快速枚举列表并对其项执行操作。
也许通过不提供ConcurrentList
他们意味着或者认为如果Parralel.For不能帮助人们不需要使用IList而是使用其他类型的集合,如堆栈或队列甚至Bag甚至是Dictionary
我同意这种设计,因为必须在多线程条件下处理可索引的集合听起来非常容易出错并且设计不好。如果在任何时候都可以修改集合并且索引将被无效,那么知道项目索引的目的是什么?在有多个读者的情况下 - 编写者对我来说非常清楚,队列或堆栈通常是最合适的集合,或者包包也可以。也可以使用字典,因为它的索引不会通过向集合添加项目而无效,如果您需要并行访问List,则可以使用Parralel.For
方法
我发现真的很奇怪 - http://msdn.microsoft.com/en-us/library/dd381935.aspx这里我们可以读到ConcurrentLinkedList类但我在System.dll中找不到它,只有Bag和BlockingCollection在那里。
我还会说至少有95%的可能性,至少两个中的任何一个对你的问题都是正确的
我还会说,通过不提供ConcurrentList,他们已经保存了那些错误地选择ConcurrentList来解决他们的问题的开发人员,他们犯了很多错误并节省了很多时间,迫使开发人员使用现有的Concurrent集合。
答案 2 :(得分:0)
考虑随机访问(IList<T>
隐含的)如何在多线程环境中工作。如果没有它是不可变的,你实际上无法做任何事情,因为添加和删除,即使它们是原子的,也不会阻止线程1删除线程2即将检索的索引处的项目。这就是为什么SyncRoot的东西在.NET 2.0 +中消失了