.net 为什么默认情况下ThreadPool每个处理器有250个工作线程?

.net 为什么默认情况下ThreadPool每个处理器有250个工作线程?,.net,multithreading,threadpool,processor,.net,Multithreading,Threadpool,Processor,摘自Microsoft文档: 默认情况下,线程池每个可用处理器有250个工作线程。你可以 使用ThreadPool.SetMaxThreads方法更改此设置 也有人说,众所周知,有一些开销: 线程有一定的开销。因此,如果一台计算机有多个处理器 如果将处理分为两个线程,则不会看到100%的性能 改进 根据一些经验和猜测,我会有类似于每个CPU 1到4个线程,而不是250个线程!有人知道为什么吗?这是一个应该给予最佳总体性能的值,还是为了让您给该线程池的几乎所有任务都得到处理而不等待其他任务完成?动

摘自Microsoft文档:

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

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

线程有一定的开销。因此,如果一台计算机有多个处理器 如果将处理分为两个线程,则不会看到100%的性能 改进


根据一些经验和猜测,我会有类似于每个CPU 1到4个线程,而不是250个线程!有人知道为什么吗?这是一个应该给予最佳总体性能的值,还是为了让您给该线程池的几乎所有任务都得到处理而不等待其他任务完成?

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

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


乔·达菲(Joe Duffy)在他的帖子中更深入地解释了这一推理:。

我认为最好问@serverfault