多线程访问会降低.NET字典的性能吗?

多线程访问会降低.NET字典的性能吗?,.net,dictionary,.net,Dictionary,在多线程应用程序中,许多不同的线程同时访问字典。看起来这可能是一个瓶颈,但还不清楚-一个可能的情况是多个线程可能试图检索相同的值(请注意,数据结构是固定的-没有线程在执行任何写入操作,但可能有几十个线程在尝试读取相同的值)。问题是,多个线程能否同时读取相同的值,还是一次读取一个值?如果是的话,还有其他数据结构可以使用吗?可以,是的。但这并不意味着它一定会成功 如果您要为读/写访问锁定字典,那么锁定会有开销……更不用说死锁的可能性了 如果没有锁定,性能就不会降低。如果您没有在访问相关的词典的任何地

在多线程应用程序中,许多不同的线程同时访问字典。看起来这可能是一个瓶颈,但还不清楚-一个可能的情况是多个线程可能试图检索相同的值(请注意,数据结构是固定的-没有线程在执行任何写入操作,但可能有几十个线程在尝试读取相同的值)。问题是,多个线程能否同时读取相同的值,还是一次读取一个值?如果是的话,还有其他数据结构可以使用吗?

可以,是的。但这并不意味着它一定会成功

如果您要为读/写访问锁定字典,那么锁定会有开销……更不用说死锁的可能性了


如果没有锁定,性能就不会降低。

如果您没有在访问相关的
词典的任何地方执行任何
lock()
-ing操作,我怀疑这可能是您遇到问题的根源。如果您只读取值而从不写入,那么应该不需要锁定(尽管您还应该考虑对字典项的成员变量的访问)


如果有很多线程经常被锁定,那么锁定本身可能会导致性能下降,但如果是这样,我认为您可能会遇到其他方面的性能问题。当然,如果锁不能正确地执行,则可能会有死锁或不必要的锁定。

< P>如果您不需要提供锁,那么当多个线程从集合中读取时,PYF将是平价或更好的。可以检查reflector中的字典实现,并查看是否有任何地方修改了支持哈希表的状态。我相信这不会有问题。

多个线程读取相同的内存值应该没有问题。当每个线程实际访问内存时,在操作系统或硬件级别可能会有一个小的等待,但在大多数情况下,这是微不足道的,而且不容易解决

关于你对这个问题的描述,我注意到“几十个(线程)可能试图读取相同的值”。如果一次处理几十个活动线程,那么瓶颈就是线程管理。与任何事物一样,存在收益递减规律和规模不经济;在当前硬件中,活动线程的数量大约是“执行单元”(内核、HT逻辑处理器,但体系结构处理多线程执行)数量的两倍,CPU开始花费比实际执行线程指令更多的时间来调度线程执行和管理线程状态。是的,您的任务管理器可能会显示数百个正在运行的线程,但其中绝大多数是“正在睡眠”、正在侦听用户交互或只是等待(如轮询线程)

我将考虑将每个“执行单元”的线程数减少到不超过两个,理想情况下只比执行单元数多几个(因此,当FSB为另一个线程读取内存时,EUs有一个线程可以“切换到”)。这将减少计算机管理所有这些线程的开销时间