我很高兴在 .Net 4.0 中看到新的 System.Collections.Concurrent 命名空间,非常好!我见过 ConcurrentDictionaryConcurrentQueueConcurrentStackConcurrentBag 和 0x251812141343334

似乎神秘失踪的一件事是 BlockingCollection 。我是否必须自己写(或从网络上下载:))?

我在这里遗漏了一些明显的东西吗?

最佳答案

gave it a try a while back(还有:on GitHub)。我的实现有一些问题,我不会在这里讨论。让我告诉你,更重要的是,我学到了什么。

首先,您无法获得无锁和线程安全的 IList<T> 的完整实现。特别是,随机插入和删除将不起作用,除非您也忘记了 O(1) 随机访问(即,除非您“作弊”并仅使用某种链表并让索引变得糟糕)。

我认为可能值得的是 IList<T> 的线程安全的有限子集:特别是,它允许 Add 并通过索引提供随机只读访问(但没有 Insert 、 831 和 12313 和 1243 等)使用权)。

这是 my RemoveAt implementation 的目标。但是当我在多线程场景中测试它的性能时,我发现 简单地同步添加到 ConcurrentList<T> 的速度更快 。基本上,添加到 List<T> 已经快如闪电了;所涉及的计算步骤的复杂性微乎其微(增加索引并分配给数组中的元素;就是这样)。您需要大量并发写入才能看到任何类型的锁争用;即便如此,每次写入的平均性能仍然会击败更昂贵的 List<T> 中的无锁实现。

在相对少见的情况下,列表的内部数组需要自行调整大小,您确实需要支付少量成本。所以最终我得出结论,这是一个只添加 ConcurrentList<T> 集合类型有意义的小众场景:当您希望保证在每次调用时添加元素的开销较低(因此,与摊销性能目标相反)。

它根本不像你想象的那么有用。

关于c# - .Net 4.0 中没有 ConcurrentList<T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6601611/

10-12 14:52