线程池耗尽时会发生什么?

时间:2013-06-13 14:20:06

标签: multithreading threadpool

在最近的学校关于网络/操作系统的课程中,我学习了线程池。现在他的基本功能非常简单,我理解这一点。

但是,我的书中没有指定的是线程池耗尽时会发生什么?例如,您有一个包含20个线程的池,并且您有20个连接的客户端。另一个客户端尝试连接,但池中没有线程,那么会发生什么?客户端是否排队?系统是否会将另一个线程放入池中?还有别的吗?

3 个答案:

答案 0 :(得分:3)

答案在很大程度上取决于您的语言,操作系统和池实施。

  

线程池耗尽时会发生什么?另一个客户端尝试连接,但池中没有线程,那么会发生什么?客户端是否排队?

通常在服务器情况下,它取决于套接字设置。套接字连接由操作系统排队或连接被拒绝。这通常是由线程池处理而不是。在~unix操作系统中,此队列或“backlog”由listen method处理。

  

系统是否会将另一个线程放入池中?

这取决于线程池。某些池是固定大小的,因此不会添加更多线程。其他线程池是“缓存”线程池,因此它将重用一个空闲线程,或者如果没有可用线程池将创建一个新线程池。许多Web服务器在其池上具有最大线程设置,因此远程用户不会通过启动太多并发连接来破坏系统。

答案 1 :(得分:1)

这取决于线程池使用的策略:

  • 池大小可以是 static ,当请求新线程时,调用者将等待信号量等同步原语,或者请求可以被推送到队列中

  • 池大小可以无限,但这可能很危险,因为创建过多线程会大大降低性能;经常注意它是介于池用户设置的最小值和最大值之间

  • 该池可以使用动态策略,具体取决于上下文硬件资源,如CPU或RAM,操作系统资源,如同步原语和线程,当前进程资源(内存,线程,句柄......)

智能线程池的一个示例:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

答案 2 :(得分:0)

这取决于线程池的实现。他们可能会被放在一个队列中,他们可能会为他们创建一个新的线程,或者他们甚至可能会收到一条错误消息,说明以后再回来。或者,如果您是实现线程池的人,您可以做任何您想做的事情。