完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//只罗列思路,没有具体的实现
//线程池的概念就是:一个包工头(管理者线程),数个打工仔(工作者线程),N个建筑工地(使用者) //线程池省资源,不无限制的开线程,但是导致任务被执行有一定的延时。 1、打工仔work:有N - M个干活的工作者线程,N表示最少干活线程数,M表示最多干活线程数 2、包工头manage:有一个管理者线程,负责调整 当前工作者线程的个数 -- 依据:当前 需要执行任务 个数的多少 3、建筑工地addTask:需要执行任务。 Addtask(),直接将活交给打工仔,包工头根据打工仔手里的活决定是招人,还是裁员 addTask: 有活干了,打工仔过来领活干 manage: 活不多,裁掉几个人。活太多,满员干,干不完,也只这10个人干, 哪一个把手头的活干完了,再领个活接着干 work: 没活儿等活儿,有活干活 void work()//干活线程的具体实现,线程的个数取决于manage()中的 线程添加算法 { while(1) { if(没有函数需要干) { pthread_cond_wait(NotEmpty);//等函数队列不为空, 是外部调用 addTask来释放信号 if(ExitThread == TRUE) { pthread_exit(); //把线程唤醒之后,发现是让退出线程 } } //从函数队列取出一个开始干 //干完之后,反馈已经干完一个了,可以在添加函数到 函数队列 中;受内存 大小的影响,可能不能无限加 任务 pthread_cond_signal( NotFull); } } void manage(void) //仅有一个 线程管理线程 { while(1) { sleep(3);//3秒做一次任务调度 if(满足创建工作线程的条件) { pthread_creat(work); //招几个工人。 1、可能活没有很多,但是总要有几个人在工地溜达 2、活真的很多,满员干 } if(满足销毁线程的条件) { pthread_cond_signal(NotEmpty); //裁几个工人。说明活真的不多 ExitThread = TRUE; } } } void addTask( callback fun ) //添加具体的函数到函数队列 { if(函数队列已经满了) { pthread_cond_wait(NotFull); //打工仔手里的活太多了,等他们干一干 } //添加函数 到 函数队列 pthread_cond_signal(NotEmpty); //告诉打工仔有活可以干了,别闲着 } |
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
3000 浏览 16 评论
3496 浏览 1 评论
9069 浏览 16 评论
4089 浏览 18 评论
1190浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 07:48 , Processed in 1.114749 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号