线程池的目的是基于缩短反复创建和销毁线程的时间,提高复用线程的效率,性能优化,如下图理解:
搬运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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了