我需要实现并发Dictionary,因为.Net不包含集合的并发实现(因为.NET4将被包含)。我可以使用Jeffrey Richter的“Power Threading Library”或现有实施的变体或任何实施的建议吗? 谢谢......
答案 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
命名空间之前);它并不多。您基本上只是想确保某些方法不会同时被调用,例如Contains
和Remove
或类似的东西。
我所做的是使用ReaderWriterLock
(在.NET 3.5及更高版本中,您可以使用ReaderWriterLockSlim
)并调用AcquireReaderLock
进行所有“读取”操作(例如{{ 1}},this[TKey]
等)和ContainsKey
用于所有“写入”操作(例如AcquireWriterLock
,this[TKey] = value
,Add
等)。请确保在Remove
/ try
块中包含此类调用,并在finally
中释放锁定。
稍微修改finally
的行为也是一个好主意:而不是枚举现有的集合,复制它并允许枚举。否则你将面临潜在的僵局。
答案 3 :(得分:0)
这是一个使用理智锁定的简单实现(虽然Interlocked
可能会更快):
http://www.tech.windowsapplication1.com/content/the-synchronized-dictionarytkey-tvalue
基本上,只需创建一个Dictionary包装器/装饰器并同步访问任何读/写操作。
切换到.Net 4.0时,只需用对基础ConcurrentDictionary的委托调用替换所有重载。