9

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

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

4

3 回答 3

6

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

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

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

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

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

于 2013-06-13T14:27:34.363 回答
1

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

  • 池大小可以是静态的,当请求新线程时,调用者将等待信号量等同步原语,或者可以将请求推入队列

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

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

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

于 2013-06-13T14:31:02.023 回答
0

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

于 2013-06-13T14:22:51.593 回答