我最近试图找出一个ThreadPool类的解决方案如何在.NET 4.0中工作。我试图通读反射代码,但对我来说似乎有点过分。在.NET 4.0中如何实现ThreadPool?
有人能深入浅出的讲解这个类是如何工作的,即
- 它如何存储了在
- 未来各方法难道是线程安全的,理应多线程试图排队的线程池中的方法?
- 当它达到可用线程的限制时,当其中一个线程变为空闲时,它将如何返回以执行队列中正在等待的其余批处理?是否有一些回调机制?
我最近试图找出一个ThreadPool类的解决方案如何在.NET 4.0中工作。我试图通读反射代码,但对我来说似乎有点过分。在.NET 4.0中如何实现ThreadPool?
有人能深入浅出的讲解这个类是如何工作的,即
当然,在没有实际执行的(或在没有埃里克利珀的:)),我说的只是常识:
QueueUserWorkItem
)。我对线程池如何实现没有特别的神秘知识。你的解释似乎是合理的。 – 2012-02-13 16:57:18
@Eric Lippert:等等,你怎么知道这个帖子提到你? AHA,所以你确实有某种隐藏的权力。无论是那个还是M $都在监视着我的一举一动。 – Tudor 2012-02-13 17:10:59
我使用http://stackoverflow.com/search?tab=newest&q=lpert的奥术力量 – 2012-02-13 17:21:51
MSDN说是
GetMaxThreads()返回一次性执行的线程数量如果 你到达这个边界,所有其他人都排队。据我所知, 需要知道何时执行线程的机制。有 RegisterWaitForSingleObject(WaitHandle中,WaitOrTimerCallback,对象,的Int32,布尔)
点1绝对不是真的。线程池早在为.NET创建Task类之前就已经实现。 – 2012-02-13 01:34:10
在代表
队列TBH,我不知道是肯定的,但如果它不是,它很危险,几乎没用,可能是M $发出的最差代码(甚至包括Windows ME)。假设它是线程安全的。
工作线程是while循环,等待委托的工作请求队列,当它变得可用时调用一个,然后当委托返回以再次等待另一个委托时在队列中再次循环。不需要任何回调。
.NET 4中的注意事项是池中的每个线程都有一个委托队列,以防止工作量的增加以平衡负载。这已经记录在MSDN博客上(从并行编程小组开始:http://blogs.msdn.com/b/pfxteam/)。 – Richard 2012-02-13 10:07:54
@Richard - 我怀疑是这样,但并不想让事情复杂化 - 总体设计和效果都是一样的,每个线程和工作的队列是一个性能增强。 – 2012-02-13 11:50:58
http://penny-arcade.com/comic/2002/07/22 – 2012-02-13 16:59:38
仅供参考,ThreadPool类是.NET的一部分,不属于C# – 2012-02-13 00:53:48