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

Multithreading 当线程池耗尽时会发生什么?,multithreading,threadpool,Multithreading,Threadpool,在学校最近的一门关于网络/操作系统的课程中,我学习了线程池。现在,他的基本功能非常简单,我理解这一点 然而,在我的书中没有详细说明的是当线程池耗尽时会发生什么?例如,您有一个池,其中包含20个线程,并且您有20个连接的客户端。另一个客户端尝试连接,但池中没有线程,然后会发生什么?客户端是否进入队列?系统是否在池中放置另一个线程?还有什么吗?这取决于线程池实现。他们可能被放在队列中,他们可能会得到一个为他们创建的新线程,或者他们甚至可能只会得到一条错误消息,说“稍后再来”。或者,如果你是实现线程池

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


然而,在我的书中没有详细说明的是当线程池耗尽时会发生什么?例如,您有一个池,其中包含20个线程,并且您有20个连接的客户端。另一个客户端尝试连接,但池中没有线程,然后会发生什么?客户端是否进入队列?系统是否在池中放置另一个线程?还有什么吗?

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

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

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

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

系统是否在池中放置另一个线程


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

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

  • 池大小可以是静态的,当请求一个新线程时,调用方将等待一个同步原语,比如信号量,或者将请求推送到队列中

  • 池大小可以是无限的,但这可能是危险的,因为创建太多线程会大大降低性能;通常情况下,介于池用户设置的最小值和最大值之间

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

智能线程池的示例如下: