当ThreadPool构造新线程而不是重用它们时?

时间:2014-06-16 12:45:38

标签: c# .net multithreading threadpool

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

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

  

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

     

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

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

2 个答案:

答案 0 :(得分:2)

正如阿德里亚诺所说,这是一个你不应该担心的实施细节。但是,出于好奇心的考虑,这是我能找到的ThreadPool如何工作的最佳解释(来自Throttling Concurrency in the CLR 4.0 ThreadPool):

  

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

简单地说,一下,爬山算法,

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

答案 1 :(得分:1)

未经证实的AFAIK'条件。

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

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