ThreadPool是如何在.NET 4.0中实现的?

时间:2012-02-13 00:43:04

标签: multithreading .net-4.0 threadpool

我最近试图弄清楚ThreadPool类的解决方案如何在.NET 4.0中运行。我尝试阅读反映的代码,但对我来说似乎有点过分了。

有人可以用简单的语言解释这个班级是如何运作的,即

  1. 如何存储进入的每种方法
  2. 它是否是线程安全的,据说多线程试图将它们的方法排入线程池?
  3. 当它达到可用线程的限制时,当其中一个线程空闲时,它如何返回执行队列中等待的剩余批处理?它有一些回调机制吗?

3 个答案:

答案 0 :(得分:2)

当然,在没有实际实施的情况下(或者在没有Eric Lippert :)的情况下)我所说的只是常识:

  1. 线程池包含一个内部(循环?)队列,其中保存任务(因此QueueUserWorkItem)。
  2. 将任务放入队列是线程安全的(这是肯定的,因为我已经多次在这个场景中使用过自己了。)
  3. 我认为每个线程无限循环,并在完成当前任务时自动从队列中获取任务(当然是以线程安全的方式)。如果队列为空,它将阻止。

答案 1 :(得分:1)

  1. 在代表队列中

  2. TBH,我不确定,但是,如果不是,它是危险的,几乎没用,可能是M $发出的最糟糕的代码,(甚至包括Windows ME)。假设它是线程安全的。

  3. 工作线程是while循环,等待委托的工作请求队列,当它变为可用时调用一个,然后当委托返回再次等待队列再次委托另一个委托时再循环回来。不需要任何回调。

答案 2 :(得分:-1)

  1. 我不知道,但我认为它将它存储在一个集合中 任务
  2. MSDN说是

  3. GetMaxThreads()返回一次执行的线程的数量 你到达这个边界所有其他人都排队等候。据我了解你 需要机制来了解何时执行线程。有 RegisterWaitForSingleObject(WaitHandle,WaitOrTimerCallback,Object,Int32,Boolean)