线程池的目的是基于缩短反复创建和销毁线程的时间,提高复用线程的效率,性能优化,如下图理解:
搬运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
Life is mess, don't let mess mess us.