C#中的并发字典

时间:2010-03-25 12:04:04

标签: c# .net

我需要实现并发Dictionary,因为.Net不包含集合的并发实现(因为.NET4将被包含)。我可以使用Jeffrey Richter的“Power Threading Library”或现有实施的变体或任何实施的建议吗? 谢谢......

4 个答案:

答案 0 :(得分:4)

我为普通的Dictionary类编写了一个线程安全的包装器,它使用Interlocked来保护内部字典。 Interlocked是迄今为止最快的锁定机制,它将提供比ReaderWriterLockSlim,Monitor或任何其他可用锁更好的性能。

该代码用于为Cache实现Fasterflect类,这是一个加速反射的库。因此,我们尝试了许多不同的方法,以找到最快的解决方案。有趣的是,.NET 4中的新并发集合明显快于我的实现,尽管与使用性能锁定机制较少的解决方案相比,两者都非常快。 .NET 3.5的实现位于文件下半部分的条件区域内。

答案 1 :(得分:3)

您可以使用Reflector查看.NET 4.0 RC并发实现的源代码,并将其复制到您自己的代码中。这样,迁移到.NET 4.0时,您将遇到的问题最少。

答案 2 :(得分:3)

我自己写了一个并发字典(在.NET 4.0的System.Collections.Concurrent命名空间之前);它并不多。您基本上只是想确保某些方法不会同时被调用,例如ContainsRemove或类似的东西。

我所做的是使用ReaderWriterLock(在.NET 3.5及更高版本中,您可以使用ReaderWriterLockSlim)并调用AcquireReaderLock进行所有“读取”操作(例如{{ 1}},this[TKey]等)和ContainsKey用于所有“写入”操作(例如AcquireWriterLockthis[TKey] = valueAdd等)。请确保在Remove / try块中包含此类调用,并在finally中释放锁定。

稍微修改finally的行为也是一个好主意:而不是枚举现有的集合,复制它并允许枚举。否则你将面临潜在的僵局。

答案 3 :(得分:0)

这是一个使用理智锁定的简单实现(虽然Interlocked可能会更快): http://www.tech.windowsapplication1.com/content/the-synchronized-dictionarytkey-tvalue

基本上,只需创建一个Dictionary包装器/装饰器并同步访问任何读/写操作。

切换到.Net 4.0时,只需用对基础ConcurrentDictionary的委托调用替换所有重载。