【问题标题】:Why ThreadPool has 250 worker threads per processor by default?为什么 ThreadPool 默认每个处理器有 250 个工作线程?
【发布时间】:2010-08-03 09:31:13
【问题描述】:

取自微软文档:

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

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

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

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

【问题讨论】:

  • 我觉得最好问问@serverfault

标签: .net multithreading threadpool processor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2012-05-14
    • 2019-12-01
    相关资源
    最近更新 更多