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

Wer*_*ght 4 .net multithreading processor threadpool

摘自Microsoft文档:

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

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

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

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

Lir*_*ran 9

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

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

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