游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Linux学习高并发服务器框架线程池介绍线程池封装

  目录前言
  本文主要学习Linux内核编程,结合VisualStudio2019进行跨平台编程,内容包括线程池介绍以及线程池封装一、线程池介绍
  线程池基本概念线程池是预先创建线程的一种技术(服务器真正意义上实现高并发就必须用线程池)举个例子:生活中的水池,是装东西的容器,用来装水的,线程池当然就是拿来装线程的线程池在任务还没有到来之前,创建一定数量的线程,放入空闲队列中,这些线程都是处于阻塞状态,不消耗CPU,但占用较小的内存空间当新任务到来时,缓冲池选择一个空闲线程,把任务传入此线程中运行,如果缓冲池已经没有空闲线程,则新建若干个线程,当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源线程池组成部分线程池类
  维护工作者线程队列(包括空闲与忙碌队列)
  维护一个任务队列
  维护一个线程池调度器指针线程池调度器(本身也是一个线程)
  负责线程调度
  负责任务分配工作者线程类(线程池中的线程类的封装)任务队列任务接口(实际的业务逻辑都继承自该接口)线程池工作原理
  根据服务器的需要,来设置线程的数量,可能是10条、20条、30条,根据服务器的承载,10条不代表只能做10个任务,总有任务做的快,有的做的慢,可能可以完成20个任务
  举个例子:如上动图所示,当我们服务器收到一个注册业务,是一个服务器要执行的任务,它会进入到任务队列,队列先进先出,顺次执行,任务会唤醒空闲列表当中的一个空闲的线程,接到任务之后,空闲线程会从空闲列表中消失,进入到忙碌列表,去完成对应的任务,完成任务后,从忙碌列表中出去,到空闲列表继续等待新任务
  如果,所有的线程都在忙,都在做任务,这时候登录进来,先进入任务队列,会创建一个新的线程来接这个任务,当所有线程都完成任务,回到空闲列表后,新创建的线程销毁,留下原先设置的对应数量线程(类似,保留老员工,把实习生裁员)队列:先进先出空闲列表(链表):不定长(有的时候可能需要创建新线程来接任务)忙碌列表(链表):不定长(有的时候可能需要创建新线程来接任务)
  话不多说,咱们上号,封装一下线程池相关函数,来进行测试
  二、线程池代码封装main。cpp主函数,设置10条线程,来执行30个任务includeiostreamincludestdio。hincludeThreadPool。hincludeChildTask。husingnamespacestd;intmain(){ThreadPoolpoolnewThreadPool(10);10条线程for(inti0;i30;i)设置30个任务{charbuf〔40〕{0};初始化sprintf(buf,sd,任务,i);BaseTasktasknewChildTask(buf);poolpushTask(task);}while(1){}return0;}ThreadPool。h对线程池进行设计,核心包括最大、最小线程数,忙碌列表,空闲列表,任务队列,互斥量,条件变量,以及线程执行函数pragmaonceincludequeue队列includelist链表头文件includepthread。h线程头文件includefind查找includeiostreamincludeBaseTask。husingnamespacestd;defineMINNUM10最小值默认参数classThreadPool{public:ThreadPool(constintnumMINNUM);ThreadPool();判断任务队列是否为空boolQueueIsEmpty();线程互斥量加锁解锁voidLock();voidUnlock();线程条件变量等待和唤醒voidWait();voidWakeUp();添加任务到任务队列voidpushTask(BaseTasktask);从任务队列移除任务BaseTaskpopTask(BaseTasktask);从忙碌回到空闲工作结束voidMoveToIdle(pthreadtid);从空闲到忙碌工作开始voidMoveToBusy(pthreadtid);线程执行函数staticvoidRunTime(voidvo);private:intthreadMinNum;最大线程数量intthreadMaxNum;最小线程数量queueBaseTasktaskQueue;任务队列listpthreadtbusyList;线程忙碌列表listpthreadtidleList;线程空闲列表pthreadmutextmutex;互斥量:做锁pthreadcondtcond;条件变量:让线程等待或者唤醒};ThreadPool。cpp对函数进行参数的设置,核心在于线程执行函数上的设置,在工作前和工作完设置打印,方便我们进行观察includeThreadPool。hThreadPool::ThreadPool(constintnum){thisthreadMinNumnum;条件变量、互斥量初始化pthreadmutexinit(thismutex,NULL);pthreadcondinit(thiscond,NULL);pthreadtid;线程num条创建for(inti0;ithisthreadMinNum;i){线程创建pthreadcreate(id,NULL,RunTime,this);thisidleList。pushback(id);线程存入空闲列表}}ThreadPool::ThreadPool(){}任务队列是否为空boolThreadPool::QueueIsEmpty(){returnthistaskQueue。empty();}线程加锁voidThreadPool::Lock(){pthreadmutexlock(thismutex);}线程解锁voidThreadPool::Unlock(){pthreadmutexunlock(thismutex);}线程等待voidThreadPool::Wait(){pthreadcondwait(thiscond,thismutex);}线程唤醒voidThreadPool::WakeUp(){pthreadcondsignal(thiscond);}添加任务到任务队列voidThreadPool::pushTask(BaseTasktask){Lock();taskQueue。push(task);Unlock();WakeUp();}从任务队列移除任务BaseTaskThreadPool::popTask(BaseTasktask){taskthistaskQueue。front();从队列头取thistaskQueue。pop();删除队列头returntask;}从忙碌回到空闲工作结束voidThreadPool::MoveToIdle(pthreadtid){listpthreadt::iteratoriter;iterfind(busyList。begin(),busyList。end(),id);if(iter!busyList。end()){从忙碌移除thisbusyList。erase(iter);添加到空闲thisidleList。pushback(iter);thisidleList。pushback(id)}}从空闲到忙碌工作开始voidThreadPool::MoveToBusy(pthreadtid){listpthreadt::iteratoriter;iterfind(idleList。begin(),idleList。end(),id);if(iter!idleList。end()){从空闲移除thisidleList。erase(iter);添加到忙碌thisbusyList。pushback(iter);thisidleList。pushback(id)}}线程执行函数voidThreadPool::RunTime(voidvo){拿到执行线程自己的id因为后面要处理忙碌和空闲的情况pthreadtidpthreadself();确保主线程与子线程分离,子线程结束后,资源自动回收pthreaddetach(id);线程参数获取ThreadPoolargThis(ThreadPool)vo;while(true){argThisLock();如果任务队列为空线程则一直等待知道任务队列不为空则会被pushTask函数唤醒线程while(argThisQueueIsEmpty()){argThisWait();}argThisMoveToBusy(id);cout工作前任务数:argThistaskQueue。size()endl;cout工作前busy:argThisbusyList。size()endl;cout工作前idle:argThisidleList。size()endl;coutendl;取任务BaseTasktask;taskargThispopTask(task);argThisUnlock();任务工作taskworking();工作结束argThisLock();argThisMoveToIdle(id);argThisUnlock();cout工作完任务数:argThistaskQueue。size()endl;cout工作完busy:argThisbusyList。size()endl;cout工作完idle:argThisidleList。size()endl;coutendl;}returnnullptr;}ChildTask。h子类配置pragmaonceincludeBaseTask。hincludeiostreamincludeunistd。hsleep头文件usingnamespacestd;classChildTask:publicBaseTask{public:ChildTask(chardata);ChildTask();voidworking();};ChildTask。cpp子类设置延时模拟做任务的时间比较长includeChildTask。hChildTask::ChildTask(chardata):BaseTask(data)参数传给父类{}ChildTask::ChildTask(){}voidChildTask::working(){coutthisdata正在执行。。。。。。endl;sleep(3);延时3秒(模拟做业务的时间比较长)}BaseTask。h基类设置结构体来装业务pragmaonceincludestring。hclassBaseTask{public:BaseTask(chardata);BaseTask();chardata〔1024〕;装业务virtualvoidworking()0;虚函数};BaseTask。cpp基类配置includeBaseTask。hBaseTask::BaseTask(chardata){bzero(thisdata,sizeof(thisdata));清空memcpy(thisdata,data,sizeof(data));}BaseTask::BaseTask(){deletethisdata;清除释放}三、测试效果通过Linux连接VS进行跨平台编程,我们可以清晰的看到有几个线程是在做任务,几个线程是空闲的,整个过程就很清晰直观的展现出来了,如下动图所示:10条线程做30个任务的全部记录,如下如所示:
  四、总结创建线程池的好处线程池的使用,能让我们搭建的高并发服务器真正意义上做到高并发降低资源消耗
  通过重复利用自己创建的线程降低线程创建和销毁造成的消耗提高响应速度
  当任务到达时,任务可以不需要等待线程创建和销毁就能立即执行提高线程的可管理性
  线程式稀缺资源,如果无限的创建线程,不仅会消耗资源,还会降低系统的稳定性
  使用线程池可以进行统一分配,调优和监控

揭秘毛主席一生对饮食的爱好和习惯茫茫九派流中国,沉沉一线穿南北。烟雨莽苍苍,龟蛇锁大江。黄鹤知何去?剩有游人处。把酒酹滔滔,心潮逐浪高!毛主席同志之所以伟大,是因为无论在他的生前……解放太原攻城惨烈,几小时伤亡3。6万人,唯一城墙碉堡幸存保留每年一到4月24日,在解放太原战役纪念场所,总会迎来众多市民前来参观瞻仰。1949年的4月24日,解放军将太原城围困半年之久,于当日拂晓发起最后总攻。解放军炮火轰开太原城墙,2……六相遇三生彼岸花开开彼岸,忘川河畔亦忘川,奈何桥头空奈何,三生石上写三生。我坐在奈何桥头,晃荡着双脚看着远处熬着汤,白发苍苍的老婆婆忍不住淡淡开口。帝女,原来您在这啊,属下找您找的……北京冬奥精神宣讲团续写双奥故事光明日报记者董城2月3日,在北京冬奥会成功举办一周年之际,北京冬奥精神宣讲团来到延庆赛区,在中关村(延庆)体育科技前沿技术创新中心举办北京冬奥会一周年专场宣讲会。8位冬奥……雇佣兵的死亡率远超军队,为什么还有士兵选择加入?雇佣兵阵亡率并不一定见得高。雇佣兵挣得钱不多。这个不多说的不是钱不多,而是相比你实际的付出,相比之下并不是那么多。举个例子,一个在东南亚最普通的雇佣兵(一般雇佣兵只招收退……荆州市最具有影响力的人是谁?刘备借荆州。最有名当然是刘备呀。荆州市第一任市長:关公。如果是问荆州市成立以来的人物,范围太小。谁能回答?1994年9月国家批准正式成立荆州市,以前是沙市市和江陵县……每天坚持练眼1小时,孩子裸眼视力达到5。1我们家孩子从发现近视到现在坚持防控也有一年多的时间了,每天就用了1个小时的时间,孩子的裸眼视力也已经回归到了5。1,总结一下我们用到的干预措施,这些都是我们家孩子日复一日,不厌……犹太人为何不敢反抗纳粹德国?犹太人为何不敢反抗纳粹德国?真相一犹太人为何不反抗纳粹?有的朋友问:犹太人在二战时期,被纳粹德国屠杀了600万人,犹太人为何不反抗?这个问题的答案是这样……盘点史上的七大奸臣,其车夫都是中郎将,严嵩竟没有上榜第一位、宦官丞相赵高秦二世的宰相,不仅独揽大权,结党营私还加重徭役赋税,加速了秦国的灭亡。秦始皇在世时,赵高只不过是嬴政的一个贴身奴婢,专门照顾自己的衣食住行。统一六国之……杨虎曾和主席一起参加开国大典,为何在享受成果时再次选择背叛1949年10月1日,中共领导人一同登上天安门城楼,见证新中国的成立。这其中有一人曾经是国民党,参与了四一二反革命政变,但这次也在受邀行列之中,并且陪同毛主席一同出席。中共可以……西游记12位美人今昔对比,差距一目了然,有人捐了107所小学说到影视剧《西游记》,相信大家最熟悉的,当属86版《西游记》。《西游记》里的人物非常丰富,天上、地下、陆地、海里,无所不包。其中的美人犹如取之不尽用之不竭的宝藏,在……汜水关前华雄连斩数将,猖狂至极,曹操的猛将们为何还不上?十八路诸侯会盟讨董,董卓派遣西凉猛将华雄镇守汜水关。华雄连战连胜,盟军被打得落花流水,那么,做为会盟讨董的发起人曹操,为什么不派上他麾下的猛将上阵与华雄一决高下呢?咱们看看当时……
14所体育类本科院校,前10排名中有你想要报考的学校吗?根据数据统计,今年有1076万大学生毕业,其中至少有12万左右的体育生从36所体育院校和其他综合院校毕业。在体育强国、健康中国的国家战略的推进下,体育产业在我国有着广阔的……对日寇的最后一战,美日蒋沆瀣一气,粟裕命令八纵6天攻克高邮1945年8月9日,毛主席对苏联对日宣战发表了一则声明,文中指出,最后地战胜日本侵略者及其一切走狗的时间已经到来了!这则声明次日便刊登在《解放日报》,后来编入《毛泽东选集》时,……河南籍烈士王焯冉,24岁感动中国,74岁的奶奶还在等孙子回家军歌应唱大刀环,誓灭胡奴出玉关。只解沙场为国死,何须马革裹尸还。清代徐锡麟《出塞》2020年6月,在加勒万河谷冲突中牺牲的四位烈士中,有一个年轻的名字有些特别……1969年宋子安离世,遗嘱寄二姐宋庆龄请她接收属于她的遗产请她接收她的遗产。1969年,一封美国发来的航空邮件飞入早已深居简出的宋庆龄家中,寄件人称自己是宋庆龄最疼爱小弟宋子安的美国律师,告知她宋子安突然在香港逝世的消息,请她接……新疆悍匪乌斯满残杀我军副师长,出动6个团连跨三省千里追捕说起新疆,让人想到的必然是那大漠孤烟直,长河落日圆之景,如今的新疆由于治安的转好,以及优美的风景,引得众多游客纷纷前往,但你能想到,在建国之初,新疆有这么一位悍匪,他带领手下,……她比李娜成名更早,如今转型为教师迎来自己42岁生日以李娜为代表的上一代金花,无疑创造了中国网球迄今为止最辉煌的阶段,大满贯冠军、女双世界第一。。。。。。一项又一项荣誉让球迷们无不为之振奋。在这之中,一枚宝贵的奥运女双金牌……立冬将至,多吃这些时令家常菜,御寒又利于瘦身,家人都很喜欢立冬将至,多吃这些时令家常菜,及时补充维生素和蛋白质,御寒又利于瘦身,家人很喜欢。下面分享这些时令家常菜的做法:清水罗氏虾【食材和配料】:罗氏虾,生姜,料酒,盐,白……古代的皇帝为什么打下江山后,都杀死身边一起打天下的人?皇帝杀死一起打江山的人,是为了消除对皇朝的后患。不过,大部分皇帝并不采用杀死这种粗暴的手段。首先要说明,皇帝并不是打下江山都杀死一起打天下的人。相反,对功臣的大批屠杀是少数例子……皇帝,佛教与花木兰五胡乱华,汉族统治阶级南迁,五胡匈奴等异族入主中原,与汉民族长达百年的共处时间,胡汉多族文化相融,形成以汉族文化为主导的中华民族,这时候由印度时期传来的佛教也盛行,南朝四百八十……亡国之君死后竟同时得到两个皇帝的两次隆重葬礼公元1644历史就此彻底改变,总之。出现的牛人太多,发生的怪事也太多,仿佛印证了冥冥之中似有天意。1644年4月25日。崇祯皇帝眼看走投无路,李自成率领起义军以摧枯拉朽之……坐拥大圣故里花果山,连云港西游牌为何打不过淮安澎湃新闻记者王奕澄2020年9月13日,江苏连云港花果山初秋景色。视觉中国资料刚刚过去的这个国庆假期,江苏淮安的西游乐园接待了10万多人次的游客,成为了华东地区国庆……项羽自刎后,手下五虎上将什么下场?季布结局最好,辅佐三个皇帝有本事的人在项羽手下都混不下去,比如韩信、陈平、范增、英布等等。究其原因,也很复杂,既有他们自生的原因,也有项羽的原因,但总体而言,还是项羽的缘故多一些,因为除范增外,日后那些……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网