[CLR Threading]当线程池线程阻塞时,线程池会创建其他线程

时间:2010-10-31 05:27:47

标签: multithreading clr threadpool

我在“CLR via C#”一书中看到了这一点,我没有理解。如果线程池中仍有线程可用,为什么会创建其他线程?

2 个答案:

答案 0 :(得分:1)

可能只是措辞不佳。

在给定的机器上,线程池可以很好地猜测机器可以在不过度扩展资源的情况下运行的最佳线程数。如果由于某种原因,一个线程被IO阻塞(例如,它等待很长时间来保存或从磁盘检索数据或来自网络设备的响应),则线程池可以启动另一个线程以利用未使用的CPU时间。当另一个线程不再阻塞时,线程池将把下一个释放的线程从池中取出,以将大小减小到“最佳”级别。

这是线程池管理的一部分,以防止系统过度使用(并通过太多线程之间的所有上下文切换降低效率),同时减少浪费的周期(当线程被阻塞时,可能没有足够的其他工作即使有等待运行的任务也要完全对任务处理器进行任务)和浪费的内存(线程已经启动并准备就绪但从未分配,因为它们已经超过CPU的任务)。

有关MSDN Managed Thread Pool的更多信息。

答案 1 :(得分:0)

这本书撒了谎。

当所有可用线程被阻止超过1秒时,Threadpool仅创建其他线程。如果有空闲线程,它将使用它们来处理您的其他任务。请注意,在线程空闲30秒后,CLR将退出线程(当然,优雅地终止它)。