快速多线程问题......
我在内存中有一个包含大约20,000个项目的字典对象。如果我有多个线程试图从这个对象读取,你会期望这会产生瓶颈吗?
NET 3.5。字典对象是只读的
Dictionary是ReadOnly所以我不关心读/写,只关注性能。
答案 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