为什么ThreadPool默认每个处理器有250个工作线程?

时间:2010-08-03 09:31:13

标签: .net multithreading threadpool processor

取自Microsoft文档:

  

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

众所周知,它也有一些开销:

  

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

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

1 个答案:

答案 0 :(得分:9)

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

当然,对于数字“250”没有任何特殊之处,如果开发人员坚持使用线程池的这种有问题的使用模式,则仍可能发生死锁。但是,它应该减少在这种情况下陷入僵局的机会。

Joe Duffy在帖子中更深入地解释了这个推理:Why the CLR 2.0 SP1's threadpool default max thread count was increased to 250/CPU