【问题标题】:When the ThreadPool constructs new threads instead reusing them?当 ThreadPool 构造新线程而不是重用它们时?
【发布时间】:2014-06-16 12:45:38
【问题描述】:

我在Reed Copsey的以下答案中阅读了以下段落:

Will values in my ThreadStatic variables still be there when cycled via ThreadPool?

线程池(通过设计)使线程在调用之间保持活动状态。 这意味着 ThreadStatic 变量将在调用之间保持不变 到 QueueUserWorkItem。

这种行为也是你不应该指望的。这 ThreadPool 将(最终自行决定)释放线程 并让它们结束,并根据需要构造新线程。

在什么情况下线程池最终会构造新线程而不是重用它们?

【问题讨论】:

    标签: c# .net multithreading threadpool


    【解决方案1】:

    正如 Adriano 所说,这是一个您不必担心的实现细节。但是,出于好奇,这是我能找到的关于 ThreadPool 工作原理的最佳解释(来自Throttling Concurrency in the CLR 4.0 ThreadPool):

    为了克服以前实现的一些限制,CLR 4.0 引入了新的想法。从控制理论领域考虑的第一种方法是爬山 (HC) 算法。这种技术是一种基于输入-输出反馈回路的自动调整方法。系统输出以小时间间隔进行监控和测量,以查看受控输入的影响,并将该信息反馈到算法中以进一步调整输入。将输入和输出视为变量,系统根据这些变量建模为函数。

    简单地说,偶尔,爬山算法,

    1. 使用当前线程数 (n) 测量输出。
    2. 向池中添加 +1 线程
    3. 使用当前线程数 (n+1) 测量输出。
    4. 如果 O(n+1) > O(n)
      1. 返回步骤 1;
      2. 否则,返回第 1 步,但这次在第 3 步释放一个线程,而不是创建一个新线程。

    【讨论】:

      【解决方案2】:

      “无证”条件下的 AFAIK。

      首先要考虑到至少有 4 个常用的CLR hosting providersASP.Net, IE, shell exesSQLCLR)并且每个都有自己的策略。例如,SQLCLR 托管使用 SQL Server 自己的Thread and Task architecture,并将通过缩小池(所有类型的池,包括线程)来响应OS signals of pressure

      那么为什么不只是假设线程总是被回收了,你会是正确的(即不要在池拥有的线程上保持状态)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2013-11-14
        • 1970-01-01
        • 2011-10-20
        • 2021-12-31
        • 2012-05-24
        相关资源
        最近更新 更多