代码之家  ›  专栏  ›  技术社区  ›  Wernight

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

  •  4
  • Wernight  · 技术社区  · 14 年前

    摘自Microsoft文档:

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

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

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

    出于某种经验和猜测,我可能会有 1到4 每个CPU的线程数,而不是 二百五十 !有人知道为什么250吗?是不是应该给 最佳总体性能 , 是不是为了让你给那个线程池的几乎所有任务 处理而不等待 其他任务要完成吗?

    1 回复  |  直到 8 年前
        1
  •  9
  •   Alex Nolasco    8 年前

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

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

    乔·达菲在他的文章中更深入地解释了这一推理: Why the CLR 2.0 SP1's threadpool default max thread count was increased to 250/CPU .