8

实现线程池的概念是什么(在 pthreads 的帮助下用 C 语言)?如何分配线程从线程池中执行?

4

3 回答 3

11

线程池是在应用程序启动时创建的固定数量的线程的集合。然后线程等待请求到达它们,通常通过由信号量控制的队列。当一个请求发出,并且至少有一个线程在等待时,线程被唤醒,为请求提供服务,然后返回等待信号量。如果没有可用的线程,则请求排队,直到有一个。

与简单地为每个请求启动一个新线程相比,线程池通常是一种更有效的资源管理方式。但是,某些架构允许在应用程序运行时创建新线程并将其添加到池中,具体取决于请求加载。

于 2009-07-27T13:16:49.143 回答
4

为了澄清以前的答案中的一些内容:

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

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

于 2012-09-26T02:22:51.747 回答
2

除了匿名的回答,我想提一下,有固定线程池,其中运行固定数量的线程;缓存线程池,可以动态增长,然后在没有可用工作时收缩;动态线程池也可以受最大线程数和/或工作队列的最大长度限制。我认为这类东西实际上没有一套术语,而且很少遇到用 C 编写的非固定 TP,但至少应该知道固定 TP 并不是唯一的一种。

于 2011-02-25T05:42:40.483 回答