4

取自微软文档:

默认情况下,线程池每个可用处理器有 250 个工作线程。您可以使用 ThreadPool.SetMaxThreads 方法更改此设置。

众所周知,还有一些开销:

线程有一定程度的开销。因此,如果一台计算机有多个处理器并且您将处理拆分为两个线程,您将不会看到 100% 的性能提升。

出于一些经验和更多猜测,我每个 CPU会有1 到 4 个线程,而不是250 个!有人知道为什么是250吗?它是应该提供最佳整体性能的某个值,还是为了让您提供给该线程池的几乎所有任务都得到处理,而无需等待其他任务完成?

4

1 回答 1

9

动机不是表现。正如您所提到的,线程过多很容易导致性能下降(由于上下文切换、缓存抖动、争用等)。
这个神奇数字背后的想法是试图避免死锁出现在用户的代码中。如果开发人员将大量工作项排队到线程池中,而该线程池等待其他项也排队到线程池中,则开发人员可能会导致死锁。如果发生线程池已使用其最大线程数(它们都处于等待状态)的情况,那么您就会陷入死锁

当然,“250”这个数字并没有什么特别之处,如果开发者坚持使用这种有问题的线程池使用模式,仍然可能会出现死锁。但是,它应该会减少在这种情况下陷入僵局的机会。

Joe Duffy 在他的帖子中更深入地解释了这个推理:为什么 CLR 2.0 SP1 的线程池默认最大线程数增加到 250/CPU

于 2010-08-03T09:41:45.013 回答