什么是线程池?

8

实现线程池的概念是什么(在C语言中通过pthreads实现)?如何将线程分配给线程池来执行?

3个回答

11
线程池是在应用程序启动时创建的一组固定数量的线程。然后,这些线程等待请求到达,通常通过由信号量控制的队列来实现。当有请求时,并且至少有一个线程在等待,该线程将被唤醒,服务于请求,然后回到等待信号量的状态。如果没有可用的线程,则请求排队等待直到有线程可用。
与为每个请求启动新线程相比,线程池通常是管理资源的更有效的方式。但是,某些架构允许在应用程序运行时根据请求负载创建并添加新线程到线程池中。

4

针对之前的回答,进行澄清:

实例化越来越多的线程导致效率低下的原因是上下文切换时间。操作系统周期性地在处理器上切换一个线程到另一个线程。这涉及将一个线程的状态保存并从内存中加载另一个线程的状态,因此每次上下文切换需要非常可观的时间N毫秒。

例如,如果您有10个线程,则上下文切换需要花费10*N毫秒。如果您有1000个线程,则需要1000*N毫秒。随着并发线程数的增加,最终上下文切换开始压倒从多线程中获得的任何效率提高。您的应用程序在最佳线程数量方面具有甜点。通过实验确定了这个甜点数字后,您可以将线程池的最大大小设置为该线程数,从而从多线程中获得最大效率。


即使进行上下文切换,花费1毫秒的时间也是不太可能的,通常这些时间更短。不过除此之外,其他都非常好。 - CrazyCasta
谁说N是整数,谁说它大于等于1? - Blah0x7B9
使用单位ms表明时间将在毫秒级别。我相信大多数阅读您答案的人不会认为上下文切换时间约为1微秒。 - CrazyCasta

2

除了anon的回答外,我想提一下还有固定线程池、可缓存的线程池和动态线程池。固定线程池中运行着固定数量的线程;可缓存的线程池可以在需要时动态增长,当没有工作可用时则会缩小;动态线程池也可以受到最大线程数和/或工作队列最大长度的限制。我认为实际上并没有针对这种情况的固定术语,而且很少会遇到使用C语言编写的非固定线程池,但至少应该知道固定线程池不是唯一的一种。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接