多线程在内存中访问大型字典对象 - 瓶颈?

时间:2010-11-24 18:25:05

标签: c# multithreading

快速多线程问题......

我在内存中有一个包含大约20,000个项目的字典对象。如果我有多个线程试图从这个对象读取,你会期望这会产生瓶颈吗?

NET 3.5。字典对象是只读的

Dictionary是ReadOnly所以我不关心读/写,只关注性能。

6 个答案:

答案 0 :(得分:5)

它不会产生瓶颈,但字典不是线程安全的,因此您可能无法获得预期的结果。在.NET 4.0中,您可以使用ConcurrentDictionary<TKey, TValue>来实现此目的。

如果它是一个只读字典,那么拥有并发读者可能是安全的,只需确保用静态构造函数中的数据填充此字典,以确保写入不会干扰读取,并且在任何线程尝试之前发生阅读。

答案 1 :(得分:3)

如果您所做的只是阅读而没有对字典进行任何写入,那么您应该没事。

在这种情况下,线程安全更多地适用于变异,所以如果你没有以任何方式改变你的字典,那么你就是好的。

答案 2 :(得分:2)

取决于锁定和写入的内容。

如果你不同时写,我认为读w / o锁是安全的,然后没有真正的瓶颈。但是没有明确的规范。

如果你写(并因此锁定),它取决于发生了什么。

答案 3 :(得分:1)

No bottleneck that I can see from reading,但我对使用枚举器有疑问。

我还没有证明这一点,但本能告诉我多线程应用,使用Dictionary Key枚举器 MIGHT 会导致一些问题......

答案 4 :(得分:1)

如果您打算初始化字典然后它仍然是只读的,那么使用普通字典就可以了,并且没有瓶颈,因为它不是线程安全的,因此没有线程同步开销。

如果您确实支持只读模式,那么我建议将您的字典封装在仅支持读取操作的容器类型类中。然后,您的客户可以通过“写入”字典来破坏您的设计意图。

答案 5 :(得分:-1)

使用此:System.Threading.ReaderWriterLock。 创建新的字典。 锁定“全球”位置。 分配它。 解锁它。

如果它只是一个数据源尝试使用ReadOnly-Property