2012-02-13 58 views
2

我最近试图找出一个ThreadPool类的解决方案如何在.NET 4.0中工作。我试图通读反射代码,但对我来说似乎有点过分。在.NET 4.0中如何实现ThreadPool?

有人能深入浅出的讲解这个类是如何工作的,即

  1. 它如何存储了在
  2. 未来各方法难道是线程安全的,理应多线程试图排队的线程池中的方法?
  3. 当它达到可用线程的限制时,当其中一个线程变为空闲时,它将如何返回以执行队列中正在等待的其余批处理?是否有一些回调机制?
+1

仅供参考,ThreadPool类是.NET的一部分,不属于C# – 2012-02-13 00:53:48

回答

2

当然,在没有实际执行的(或在没有埃里克利珀的:)),我说的只是常识:

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

我对线程池如何实现没有特别的神秘知识。你的解释似乎是合理的。 – 2012-02-13 16:57:18

+0

@Eric Lippert:等等,你怎么知道这个帖子提到你? AHA,所以你确实有某种隐藏的权力。无论是那个还是M $都在监视着我的一举一动。 – Tudor 2012-02-13 17:10:59

+2

我使用http://stackoverflow.com/search?tab=newest&q=lpert的奥术力量 – 2012-02-13 17:21:51

-1
  1. 我不知道exectly,但在我看来它存储的 集合中的任务
  2. MSDN说是

  3. GetMaxThreads()返回一次性执行的线程数量如果 你到达这个边界,所有其他人都排队。据我所知, 需要知道何时执行线程的机制。有 RegisterWaitForSingleObject(WaitHandle中,WaitOrTimerCallback,对象,的Int32,布尔)

+2

点1绝对不是真的。线程池早在为.NET创建Task类之前就已经实现。 – 2012-02-13 01:34:10

1
  1. 在代表

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

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

+1

.NET 4中的注意事项是池中的每个线程都有一个委托队列,以防止工作量的增加以平衡负载。这已经记录在MSDN博客上(从并行编程小组开始:http://blogs.msdn.com/b/pfxteam/)。 – Richard 2012-02-13 10:07:54

+1

@Richard - 我怀疑是这样,但并不想让事情复杂化 - 总体设计和效果都是一样的,每个线程和工作的队列是一个性能增强。 – 2012-02-13 11:50:58

+8

http://penny-arcade.com/comic/2002/07/22 – 2012-02-13 16:59:38