【问题标题】:What is a Thread-pool?什么是线程池?
【发布时间】:2010-11-14 08:32:24
【问题描述】:

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

【问题讨论】:

    标签: c pthreads threadpool


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        澄清以前的答案:

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

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

        【讨论】:

        • 上下文切换不太可能需要 1 毫秒,通常这些更符合我们的思路。不过其他一切都很好。
        • 谁说 N 是整数,谁说它 >= 1?
        • 使用单位 ms 表明时间将在 ms 的数量级上。我相信大多数阅读您的答案的人不会认为上下文切换时间大约是 1 us。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 2015-10-29
        • 2014-05-03
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2011-03-18
        相关资源
        最近更新 更多