线程池的目的是基于缩短反复创建和销毁线程的时间,提高复用线程的效率,性能优化,如下图理解:

搬运0000四个任务量(做一个很粗略的解释)

单线程: 0000 4t

多线程: 0

               00

                 0

                   3t(maybe)

线程池:00

                  00

      2t

 

基本原理可以这样理解:

假设T1、T2、T3和T4任务,两个容器分别作为任务容器和线程容器,任务容器不定时接收T1-T4任务,同时线程容器不定时定量通过线程处理任务。

a. 线程池初始化两个动态的线程使用,任务容器此时来T1 和 T2,线程容器利用现有线程处理T1 和 T2任务。

b. 接着再来T3 和 T4,不需要重新创建线程,直接根据现有直接使用,以此类推处理。(线程就是一个通道,具体任务具体执行)

 

更为贴切的例子:

某地铁站每分钟出站乘客2个人,站口时刻有两台自行车使用,此时出来2个人,2人上车,a去a地方,b去b地方,此时线程非空闲,0车0人,此时出来两个人,

车回来一台,一个人使用,另一个等待。

main函数参考:

int main (int argc, char **argv)
{
    printf("welcome to use pthreadpool now......\n");
    pool_init (2);/*线程池中最多三个活动线程*/

    /*连续向池中投入10个任务*/
    int *workingnum = (int *) malloc (sizeof (int) * 10);
    int i;
    for (i = 0; i < 4; i++)/*模拟T1-T4*/
    {
        workingnum[i] = i;
        pool_add_worker (myprocess, &workingnum[i]);
    }
    /*等待所有任务完成*/
    sleep (20);
    /*销毁线程池*/
    pool_destroy ();
    free (workingnum);
    return 0;
}

 

参考代码博客:

https://blog.csdn.net/u010027547/article/details/48683149?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242