范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  目录前言
  本文主要学习   Linux内核编程   ,结合   Visual Studio 2019   进行跨平台编程,内容包括线程池介绍以及线程池封装  一、线程池介绍
  线程池基本概念线程池   是预先创建线程的一种技术 (服务器真正意义上实现高并发就必须用线程池)  举个例子:生活中的水池,是装东西的容器,用来装水的,线程池当然就是拿来装线程的  线程池在任务还没有到来之前,创建一定数量的线程,放入空闲队列中,这些线程都是处于阻塞状态,不消耗CPU,但占用较小的内存空间  当新任务到来时,缓冲池选择一个空闲线程,把任务传入此线程中运行,如果缓冲池已经没有空闲线程,则新建若干个线程,当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源  线程池组成部分线程池类
  维护工作者线程队列(包括空闲与忙碌队列)
  维护一个任务队列
  维护一个线程池调度器指针  线程池调度器   (本身也是一个线程)
  负责线程调度
  负责任务分配  工作者线程类   (线程池中的线程类的封装)  任务队列  任务接口   (实际的业务逻辑都继承自该接口)  线程池工作原理
  根据服务器的需要,来设置线程的数量,可能是10条、20条、30条,根据服务器的承载,10条不代表只能做10个任务,总有任务做的快,有的做的慢,可能可以完成20个任务
  举个例子:如上动图所示,当我们服务器收到一个注册业务,是一个服务器要执行的任务,它会进入到任务队列,队列先进先出,顺次执行,任务会唤醒空闲列表当中的一个空闲的线程,接到任务之后,空闲线程会从空闲列表中消失,进入到忙碌列表,去完成对应的任务,完成任务后,从忙碌列表中出去,到空闲列表继续等待新任务
  如果,所有的线程都在忙,都在做任务,这时候登录进来,先进入任务队列,会创建一个新的线程来接这个任务,当所有线程都完成任务,回到空闲列表后,新创建的线程销毁,留下原先设置的对应数量线程(类似,保留老员工,把实习生裁员)  队列:   先进先出  空闲列表(链表):   不定长(有的时候可能需要创建新线程来接任务)  忙碌列表(链表):   不定长(有的时候可能需要创建新线程来接任务)
  话不多说,咱们上号,封装一下线程池相关函数,来进行测试
  二、线程池代码封装main.cpp主函数,设置10条线程,来执行30个任务  #include #include #include "ThreadPool.h"#include "ChildTask.h"using namespace std;int main(){ThreadPool* pool = new ThreadPool(10);//10条线程for (int i = 0; i < 30; i++)//设置30个任务{char buf[40] = { 0 };//初始化sprintf(buf, "%s%d", "任务", i);BaseTask* task = new ChildTask(buf);pool->pushTask(task);}while (1) {}return 0;}ThreadPool.h对线程池进行设计,核心包括   最大、最小线程数   ,   忙碌列表   ,   空闲列表   ,   任务队列   ,   互斥量   ,   条件变量   ,以及   线程执行函数  #pragma once#include //队列#include //链表头文件#include //线程头文件#include //find查找#include #include "BaseTask.h"using namespace std;#define MIN_NUM 10//最小值 默认参数class ThreadPool{public:ThreadPool(const int num = MIN_NUM);~ThreadPool();//判断任务队列是否为空bool QueueIsEmpty();//线程互斥量加锁解锁void Lock();void Unlock();//线程条件变量等待和唤醒void Wait();void WakeUp();//添加任务到任务队列void pushTask(BaseTask* task);//从任务队列移除任务BaseTask* popTask(BaseTask* task);//从忙碌回到空闲 工作结束void MoveToIdle(pthread_t id);//从空闲到忙碌 工作开始void MoveToBusy(pthread_t id);//线程执行函数static void* RunTime(void* vo);private:int threadMinNum;//最大线程数量int threadMaxNum;//最小线程数量queuetaskQueue;//任务队列listbusyList;//线程忙碌列表listidleList;//线程空闲列表pthread_mutex_t mutex;//互斥量:做锁pthread_cond_t cond;//条件变量:让线程等待或者唤醒};ThreadPool.cpp对函数进行参数的设置,核心在于线程执行函数上的设置,在工作前和工作完设置打印,方便我们进行观察  #include "ThreadPool.h"ThreadPool::ThreadPool(const int num){this->threadMinNum = num;//条件变量、互斥量初始化pthread_mutex_init(&this->mutex, NULL);pthread_cond_init(&this->cond, NULL);pthread_t id;//线程num条创建for (int i = 0; i < this->threadMinNum; i++){//线程创建pthread_create(&id, NULL, RunTime, this);this->idleList.push_back(id);//线程存入空闲列表}}ThreadPool::~ThreadPool(){}//任务队列是否为空bool ThreadPool::QueueIsEmpty(){return this->taskQueue.empty();}//线程加锁void ThreadPool::Lock(){pthread_mutex_lock(&this->mutex);}//线程解锁void ThreadPool::Unlock(){pthread_mutex_unlock(&this->mutex);}//线程等待void ThreadPool::Wait(){pthread_cond_wait(&this->cond, &this->mutex);}//线程唤醒void ThreadPool::WakeUp(){pthread_cond_signal(&this->cond);}//添加任务到任务队列void ThreadPool::pushTask(BaseTask* task){Lock();taskQueue.push(task);Unlock();WakeUp();}//从任务队列移除任务BaseTask* ThreadPool::popTask(BaseTask* task){task = this->taskQueue.front();//从队列头取this->taskQueue.pop();//删除队列头return task;}//从忙碌回到空闲 工作结束void ThreadPool::MoveToIdle(pthread_t id){list::iterator iter;iter = find(busyList.begin(), busyList.end(), id);if (iter != busyList.end()){//从忙碌移除this->busyList.erase(iter);//添加到空闲this->idleList.push_back(*iter);//this->idleList.push_back(id)}}//从空闲到忙碌 工作开始void ThreadPool::MoveToBusy(pthread_t id){list::iterator iter;iter = find(idleList.begin(), idleList.end(), id);if (iter != idleList.end()){//从空闲移除this->idleList.erase(iter);//添加到忙碌this->busyList.push_back(*iter);//this->idleList.push_back(id)}}//线程执行函数void* ThreadPool::RunTime(void* vo){//拿到执行线程自己的id 因为后面要处理忙碌和空闲的情况pthread_t id = pthread_self();//确保主线程与子线程分离,子线程结束后,资源自动回收pthread_detach(id);//线程参数获取ThreadPool* argThis = (ThreadPool*)vo;while (true){argThis->Lock();//如果任务队列为空 线程则一直等待 //知道任务队列不为空则会被pushTask函数唤醒线程while (argThis->QueueIsEmpty()){argThis->Wait();}argThis->MoveToBusy(id);cout << "工作前  任务数:" << argThis->taskQueue.size() << endl;cout << "工作前  busy:" << argThis->busyList.size() << endl;cout << "工作前  idle:" << argThis->idleList.size() << endl;cout << "-----------------------------------------------" << endl;//取任务BaseTask* task;task = argThis->popTask(task);argThis->Unlock();//任务工作task->working();//工作结束argThis->Lock();argThis->MoveToIdle(id);argThis->Unlock();cout << "工作完  任务数:" << argThis->taskQueue.size() << endl;cout << "工作完  busy:" << argThis->busyList.size() << endl;cout << "工作完  idle:" << argThis->idleList.size() << endl;cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;}return nullptr;}ChildTask.h子类配置  #pragma once#include "BaseTask.h"#include #include //sleep头文件using namespace std;class ChildTask :public BaseTask{public:ChildTask(char* data);~ChildTask();void working();};ChildTask.cpp子类设置延时模拟做任务的时间比较长  #include "ChildTask.h"ChildTask::ChildTask(char* data) :BaseTask(data)//参数传给父类{}ChildTask::~ChildTask(){}void ChildTask::working(){cout << this->data << "正在执行......" << endl;sleep(3);//延时3秒 (模拟做业务的时间比较长)}BaseTask.h基类设置结构体来装业务  #pragma once#include class BaseTask{public:BaseTask(char* data);~BaseTask();char data[1024]; //装业务virtual void working() = 0;//虚函数};BaseTask.cpp基类配置  #include "BaseTask.h"BaseTask::BaseTask(char* data){bzero(this->data, sizeof(this->data));//清空memcpy(this->data, data, sizeof(data));}BaseTask::~BaseTask(){delete this->data;//清除释放}三、测试效果通过Linux连接VS进行跨平台编程,我们可以清晰的看到有几个线程是在做任务,几个线程是空闲的,整个过程就很清晰直观的展现出来了,如下动图所示:  10条线程做30个任务的全部记录,如下如所示:
  四、总结创建线程池的好处线程池的使用,能让我们搭建的高并发服务器真正意义上做到高并发  降低资源消耗
  通过重复利用自己创建的线程降低线程创建和销毁造成的消耗  提高响应速度
  当任务到达时,任务可以不需要等待线程创建和销毁就能立即执行  提高线程的可管理性
  线程式稀缺资源,如果无限的创建线程,不仅会消耗资源,还会降低系统的稳定性
  使用线程池可以进行统一分配,调优和监控

泰安打响树国企形象创国资速度改革品牌记者从12月29日泰安市政府新闻办召开的新闻发布会上了解到,今年以来,泰安市按照省委省政府部署要求,以实施国企改革三年行动为抓手,坚持问题导向目标导向结果导向,树牢有解思维,狠抓改福汇出金单笔最高可以多少美金?有很多新用户,特别是交易了很多年,有了稳定盈利目标以后,总是担心福汇大额出金的问题,今天福汇蒋超就给大家介绍一下关于福汇出金单笔最高可以多少美金?有过很多年外汇交易经验的客户,可能冰雪小镇走出童话世界?冬季风暴席卷北美,多地房屋变冰雕视频加载中(央视财经天下财经)北美地区遭遇的大范围冬季风暴,使美国加拿大多地房屋被冻成冰雕。在加拿大安大略省的伊利堡镇,连日的严寒天气下,小镇上大片房屋被厚厚的冰雪包裹,成了天然的双城记三周年合广长协同发展示范区建设各项重点工作有序推进2023年1月,成渝地区双城经济圈建设即将满三周年。12月27日,中国日报记者从重庆市合川区发展和改革委员会获悉,今年以来,合川区抢抓成渝地区双城经济圈建设机遇,携手四川省广安市和总投资5。1亿元!甘肃科技投资集团机械院高强高导铜合金材料产业化项目开工甘肃科技集团机械院党委书记董事长杨昊介绍相关情况中国甘肃网12月29日讯(本网记者沈文刚)12月29日,甘肃科技投资集团机械院高强高导铜合金材料产业化项目在兰州新区开工。甘肃科技集半导体产量持续萎缩,韩国出口不断下降,明年经济前景黯淡?据悉,今年以来,全球主要经济体进入衰退的风险正在不断上升,世界经济贸易的疲软也使得韩国工业产出面临着巨大的压力。数据显示,截至12月29日,韩国的半导体产业已经进入连续第四个月的低南县深耕电商沃土做强县域经济我手里拿着的是南县稻虾米,口感软糯清甜,现在下单还有优惠12月17日,在南县电子商务公共服务中心室内直播间,主播向网友热情推介南县特色农产品。线上直播带货,在南县并不稀罕。近年来,久久的冬恋诗平德生命不一定鲜活干枯的树叶笃定寒冬抱着刺骨的风抱过几朵雪花抱死在高高的枝头望尽凄凉为什么不在深秋里寻一方归宿莫非只为久久的冬恋眺望春阳抱暖枝头在春风里悄然离去把枝头留给新叶同根不用等未来,现在就是你的,姆巴佩1。8亿欧身价碾压梅罗看着自己的俱乐部队友梅西捧起大力神杯这一刻,没人比姆巴佩更懂的失败是何滋味与冠军失之交臂,领取世界杯金靴奖时,姆巴佩面无表情谁都不知道他内心里想的是什么世界杯决赛上演帽子戏法,以一AAC瑞声科技首发三大技术新品全新仿生振感马达将于明年1月上市中国网科技12月29日讯(记者单征宇)AAC瑞声科技今日推出行业首发Opera高低音分频方案全新声学触觉一体化Combo方案以及安卓顶级仿生振感马达三大技术新品。AAC瑞声科技执行曾为福特创造17亿美元价值!他从海外归国,创业当董事长,近日获重磅表彰!日前,36氪2022全球华人精英Power100名单揭晓,优秀华人企业家代表北京高科数聚科技有限公司董事长上海大学1982届校友程杰入选。在登上该榜单之前,程杰已在美国硅谷和全球大
中国男篮2022亚洲杯耻辱一战,无缘4强北京时间7月20日,中国队首次输给人口仅600万的黎巴嫩男篮,无缘4强!震惊之余,我查了一下百度,黎巴嫩人口约600万,国土面积10452平方公里(比我国直辖市天津11916。85大反转!中国男篮爆冷出局不怪杜锋,人民日报连夜发声,直指姚明大家好!欢迎来到大胡子体育吧!本期节目我们将继续关注中国男篮。我们知道,在无缘东京奥运会之后,由杜锋接手的中国男篮也是开始了大面积的改造。包括核心老将易建联韩德君等球员的退出,以及无缘四强,周琦成中国男篮遮羞布7月20日,亚洲杯14决赛继续进行。中国男篮经过四节的挣扎,以6972不敌黎巴嫩,无缘四强。本来伊朗输给约旦,就给中国队直通决赛铺路了,奈何自己不争气。简单回顾一下本场比赛。1。前美国开始突破6G技术,中国院士多次发出警告,外媒被华为刺激了作为当下全球排名第一的苹果手机,前不久却传出了一则不利消息,那就是苹果自研5G基带失败,投入上亿元打了水漂。苹果之所以研发5G基带失败,并不是因为技术水平不够,而是因为5G基带已经专家陈浩中国人没那么穷,谁家没个50万?专家口出雷人语录,近来屡见不鲜。最近有视频显示,陈浩在一期访谈节目中笑着说国内家庭平均总资产300万很正常,现在谁家没个50万现金呢?上述观点一出,由于与不少人经验相冲突,引发网友中国钢铁侠盲盒碎片空投公告中国钢铁侠,优质科技博主,亚洲首个穿戴式飞行服制作者,爱奇艺科技真人秀机器人争霸技术总监!因穿着自制飞行服试飞的场景,让很多网友惊呼这是中国版的钢铁侠!中国钢铁侠抖音主页空投条件青建议严惩亚洲杯裁判,3次误判夺走中国男篮胜利,杜锋输得遗憾在最近落下帷幕的比赛中,中国队迎战黎巴嫩,最终没有能够出现奇迹,我们以三分的劣势输给了对手,无缘最终金牌的争夺。对于中国队来说,在这一次输掉比赛之后,就意味着中国队将彻底止步八强,中国男篮2022亚洲杯耻辱一战,无缘4强北京时间7月20日,中国队首次输给人口仅600万的黎巴嫩男篮,无缘4强!震惊之余,我查了一下百度,黎巴嫩人口约600万,国土面积10452平方公里(比我国直辖市天津11916。85大反转!中国男篮爆冷出局不怪杜锋,人民日报连夜发声,直指姚明大家好!欢迎来到大胡子体育吧!本期节目我们将继续关注中国男篮。我们知道,在无缘东京奥运会之后,由杜锋接手的中国男篮也是开始了大面积的改造。包括核心老将易建联韩德君等球员的退出,以及无缘四强,周琦成中国男篮遮羞布7月20日,亚洲杯14决赛继续进行。中国男篮经过四节的挣扎,以6972不敌黎巴嫩,无缘四强。本来伊朗输给约旦,就给中国队直通决赛铺路了,奈何自己不争气。简单回顾一下本场比赛。1。前美国开始突破6G技术,中国院士多次发出警告,外媒被华为刺激了作为当下全球排名第一的苹果手机,前不久却传出了一则不利消息,那就是苹果自研5G基带失败,投入上亿元打了水漂。苹果之所以研发5G基带失败,并不是因为技术水平不够,而是因为5G基带已经