实现Thread-pool的概念是什么(在C中使用pthreads的帮助)? 如何将线程分配给线程池执行?
答案 0 :(得分:11)
线程池是在应用程序启动时创建的固定数量的线程的集合。然后线程等待请求来到它们,通常是通过由信号量控制的队列。当发出请求,并且至少有一个线程在等待时,线程被唤醒,为请求提供服务,然后返回等待信号量。如果没有可用的线程,则请求排队直到一个。
线程池通常比管理每个请求的新线程更有效地管理资源。但是,某些体系结构允许在应用程序运行时创建新线程并将其添加到池中,具体取决于请求加载。
答案 1 :(得分:4)
澄清先前答案中的内容:
实例化越来越多的线程导致效率低下的原因是上下文切换时间。操作系统会定期在处理器上切换另一个线程。这涉及保存一个线程的状态并从内存加载另一个线程的状态,因此每个上下文切换需要不可忽略的时间N ms。
例如,如果您有10个线程,则上下文切换takex 10 * N ms。如果你有1000个线程,它是1000 * N ms。随着并发线程数量的增加,最终上下文切换开始压倒从多线程派生的任何效率。您的应用程序在最佳线程数方面有一个最佳位置。通过实验确定此甜蜜数字后,可以将线程池最大大小设置为该线程数,从而通过多线程获得最大效率。
答案 2 :(得分:2)
添加到anon的答案我想提一下,有固定的线程池,其中有固定数量的线程运行;缓存的线程池,当没有可用的工作时可以动态增长然后收缩;动态线程池也可以由最大线程数和/或工作队列的最大长度绑定。我认为这种东西实际上没有一套术语,而且很少遇到用C语言编写的非固定TP,但至少有一个人应该知道固定的TP不是唯一的那种。