亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                「Linux學(xué)習(xí)」高并發(fā)服務(wù)器框架 線程池介紹+線程池封裝

                「Linux學(xué)習(xí)」高并發(fā)服務(wù)器框架 線程池介紹+線程池封裝

                目錄

                前言

                本文主要學(xué)習(xí) Linux內(nèi)核編程 ,結(jié)合 Visual Studio 2019 進(jìn)行跨平臺(tái)編程,內(nèi)容包括線程池介紹以及線程池封裝

                一、線程池介紹

                線程池基本概念

                • 線程池 是預(yù)先創(chuàng)建線程的一種技術(shù) (服務(wù)器真正意義上實(shí)現(xiàn)高并發(fā)就必須用線程池)
                • 舉個(gè)例子:生活中的水池,是裝東西的容器,用來(lái)裝水的,線程池當(dāng)然就是拿來(lái)裝線程的
                • 線程池在任務(wù)還沒有到來(lái)之前,創(chuàng)建一定數(shù)量的線程,放入空閑隊(duì)列中,這些線程都是處于阻塞狀態(tài),不消耗CPU,但占用較小的內(nèi)存空間
                • 當(dāng)新任務(wù)到來(lái)時(shí),緩沖池選擇一個(gè)空閑線程,把任務(wù)傳入此線程中運(yùn)行,如果緩沖池已經(jīng)沒有空閑線程,則新建若干個(gè)線程,當(dāng)系統(tǒng)比較空閑時(shí),大部分線程都一直處于暫停狀態(tài),線程池自動(dòng)銷毀一部分線程,回收系統(tǒng)資源

                線程池組成部分

                • 線程池類

                維護(hù)工作者線程隊(duì)列(包括空閑與忙碌隊(duì)列)

                維護(hù)一個(gè)任務(wù)隊(duì)列

                維護(hù)一個(gè)線程池調(diào)度器指針

                • 線程池調(diào)度器 (本身也是一個(gè)線程)

                負(fù)責(zé)線程調(diào)度

                負(fù)責(zé)任務(wù)分配

                • 工作者線程類 (線程池中的線程類的封裝)
                • 任務(wù)隊(duì)列
                • 任務(wù)接口 (實(shí)際的業(yè)務(wù)邏輯都繼承自該接口)

                線程池工作原理

                根據(jù)服務(wù)器的需要,來(lái)設(shè)置線程的數(shù)量,可能是10條、20條、30條,根據(jù)服務(wù)器的承載,10條不代表只能做10個(gè)任務(wù),總有任務(wù)做的快,有的做的慢,可能可以完成20個(gè)任務(wù)

                舉個(gè)例子:如上動(dòng)圖所示,當(dāng)我們服務(wù)器收到一個(gè)注冊(cè)業(yè)務(wù),是一個(gè)服務(wù)器要執(zhí)行的任務(wù),它會(huì)進(jìn)入到任務(wù)隊(duì)列,隊(duì)列先進(jìn)先出,順次執(zhí)行,任務(wù)會(huì)喚醒空閑列表當(dāng)中的一個(gè)空閑的線程,接到任務(wù)之后,空閑線程會(huì)從空閑列表中消失,進(jìn)入到忙碌列表,去完成對(duì)應(yīng)的任務(wù),完成任務(wù)后,從忙碌列表中出去,到空閑列表繼續(xù)等待新任務(wù)

                如果,所有的線程都在忙,都在做任務(wù),這時(shí)候登錄進(jìn)來(lái),先進(jìn)入任務(wù)隊(duì)列,會(huì)創(chuàng)建一個(gè)新的線程來(lái)接這個(gè)任務(wù),當(dāng)所有線程都完成任務(wù),回到空閑列表后,新創(chuàng)建的線程銷毀,留下原先設(shè)置的對(duì)應(yīng)數(shù)量線程(類似,保留老員工,把實(shí)習(xí)生裁員)

                • 隊(duì)列: 先進(jìn)先出
                • 空閑列表(鏈表): 不定長(zhǎng)(有的時(shí)候可能需要?jiǎng)?chuàng)建新線程來(lái)接任務(wù))
                • 忙碌列表(鏈表): 不定長(zhǎng)(有的時(shí)候可能需要?jiǎng)?chuàng)建新線程來(lái)接任務(wù))

                話不多說,咱們上號(hào),封裝一下線程池相關(guān)函數(shù),來(lái)進(jìn)行測(cè)試

                二、線程池代碼封裝

                main.cpp

                • 主函數(shù),設(shè)置10條線程,來(lái)執(zhí)行30個(gè)任務(wù)

                #include #include #include “ThreadPool.h”#include “ChildTask.h”using namespace std;int main(){ThreadPool* pool = new ThreadPool(10);//10條線程for (int i = 0; i pushTask(task);}while (1) {}return 0;}

                ThreadPool.h

                • 對(duì)線程池進(jìn)行設(shè)計(jì),核心包括 最大、最小線程數(shù) , 忙碌列表 , 空閑列表 , 任務(wù)隊(duì)列 , 互斥量 , 條件變量 ,以及 線程執(zhí)行函數(shù)

                #pragma once#include //隊(duì)列#include //鏈表頭文件#include //線程頭文件#include //find查找#include #include “BaseTask.h”using namespace std;#define MIN_NUM 10//最小值 默認(rèn)參數(shù)class ThreadPool{public:ThreadPool(const int num = MIN_NUM);~ThreadPool();//判斷任務(wù)隊(duì)列是否為空bool QueueIsEmpty();//線程互斥量加鎖解鎖void Lock();void Unlock();//線程條件變量等待和喚醒void Wait();void WakeUp();//添加任務(wù)到任務(wù)隊(duì)列void pushTask(BaseTask* task);//從任務(wù)隊(duì)列移除任務(wù)BaseTask* popTask(BaseTask* task);//從忙碌回到空閑 工作結(jié)束void MoveToIdle(pthread_t id);//從空閑到忙碌 工作開始void MoveToBusy(pthread_t id);//線程執(zhí)行函數(shù)static void* RunTime(void* vo);private:int threadMinNum;//最大線程數(shù)量int threadMaxNum;//最小線程數(shù)量queuetaskQueue;//任務(wù)隊(duì)列l(wèi)istbusyList;//線程忙碌列表listidleList;//線程空閑列表pthread_mutex_t mutex;//互斥量:做鎖pthread_cond_t cond;//條件變量:讓線程等待或者喚醒};

                ThreadPool.cpp

                • 對(duì)函數(shù)進(jìn)行參數(shù)的設(shè)置,核心在于線程執(zhí)行函數(shù)上的設(shè)置,在工作前和工作完設(shè)置打印,方便我們進(jìn)行觀察

                #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條創(chuàng)建for (int i = 0; i threadMinNum; i++){//線程創(chuàng)建pthread_create(&id, NULL, RunTime, this);this->idleList.push_back(id);//線程存入空閑列表}}ThreadPool::~ThreadPool(){}//任務(wù)隊(duì)列是否為空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);}//添加任務(wù)到任務(wù)隊(duì)列void ThreadPool::pushTask(BaseTask* task){Lock();taskQueue.push(task);Unlock();WakeUp();}//從任務(wù)隊(duì)列移除任務(wù)BaseTask* ThreadPool::popTask(BaseTask* task){task = this->taskQueue.front();//從隊(duì)列頭取this->taskQueue.pop();//刪除隊(duì)列頭return task;}//從忙碌回到空閑 工作結(jié)束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)}}//線程執(zhí)行函數(shù)void* ThreadPool::RunTime(void* vo){//拿到執(zhí)行線程自己的id 因?yàn)楹竺嬉幚砻β岛涂臻e的情況pthread_t id = pthread_self();//確保主線程與子線程分離,子線程結(jié)束后,資源自動(dòng)回收pthread_detach(id);//線程參數(shù)獲取ThreadPool* argThis = (ThreadPool*)vo;while (true){argThis->Lock();//如果任務(wù)隊(duì)列為空 線程則一直等待 //知道任務(wù)隊(duì)列不為空則會(huì)被pushTask函數(shù)喚醒線程while (argThis->QueueIsEmpty()){argThis->Wait();}argThis->MoveToBusy(id);cout << "工作前 任務(wù)數(shù):" <taskQueue.size() << endl;cout << "工作前 busy:" <busyList.size() << endl;cout << "工作前 idle:" <idleList.size() << endl;cout << "———————————————–" Unlock();//任務(wù)工作task->working();//工作結(jié)束argThis->Lock();argThis->MoveToIdle(id);argThis->Unlock();cout << "工作完 任務(wù)數(shù):" <taskQueue.size() << endl;cout << "工作完 busy:" <busyList.size() << endl;cout << "工作完 idle:" <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

                • 子類設(shè)置延時(shí)模擬做任務(wù)的時(shí)間比較長(zhǎng)

                #include “ChildTask.h”ChildTask::ChildTask(char* data) :BaseTask(data)//參數(shù)傳給父類{}ChildTask::~ChildTask(){}void ChildTask::working(){cout <data << "正在執(zhí)行……" << endl;sleep(3);//延時(shí)3秒 (模擬做業(yè)務(wù)的時(shí)間比較長(zhǎng))}

                BaseTask.h

                • 基類設(shè)置結(jié)構(gòu)體來(lái)裝業(yè)務(wù)

                #pragma once#include class BaseTask{public:BaseTask(char* data);~BaseTask();char data[1024]; //裝業(yè)務(wù)virtual void working() = 0;//虛函數(shù)};

                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;//清除釋放}

                三、測(cè)試效果

                • 通過Linux連接VS進(jìn)行跨平臺(tái)編程,我們可以清晰的看到有幾個(gè)線程是在做任務(wù),幾個(gè)線程是空閑的,整個(gè)過程就很清晰直觀的展現(xiàn)出來(lái)了,如下動(dòng)圖所示:
                • 10條線程做30個(gè)任務(wù)的全部記錄,如下如所示:

                四、總結(jié)

                創(chuàng)建線程池的好處

                • 線程池的使用,能讓我們搭建的高并發(fā)服務(wù)器真正意義上做到高并發(fā)
                • 降低資源消耗

                通過重復(fù)利用自己創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗

                • 提高響應(yīng)速度

                當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等待線程創(chuàng)建和銷毀就能立即執(zhí)行

                • 提高線程的可管理性

                線程式稀缺資源,如果無(wú)限的創(chuàng)建線程,不僅會(huì)消耗資源,還會(huì)降低系統(tǒng)的穩(wěn)定性

                使用線程池可以進(jìn)行統(tǒng)一分配,調(diào)優(yōu)和監(jiān)控

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年8月16日 09:35
                下一篇 2022年8月16日 09:35

                相關(guān)推薦

                • 短視頻策劃內(nèi)容的3個(gè)要點(diǎn)(短視頻策劃內(nèi)容怎么做)

                  短視頻在制作時(shí),內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過時(shí)了?,F(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

                  2022年11月27日
                • 存儲(chǔ)過程語(yǔ)法(sql server存儲(chǔ)過程語(yǔ)法)

                  今天小編給各位分享存儲(chǔ)過程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過程基本語(yǔ)法…

                  2022年11月26日
                • 妻子發(fā)微信:“我老公不在,快來(lái)”,同事:“下了班就來(lái)找你”

                  在現(xiàn)如今網(wǎng)絡(luò)如此發(fā)達(dá)的時(shí)代,大家可以從各個(gè)地方了解到全國(guó)大事小事,正所謂世界之大無(wú)奇不有,每天都發(fā)生著奇奇怪怪的事情,今天小編突然看到這樣一件事,看完之后都不知道說什么好了。 王某…

                  2022年11月26日
                • 《樂隊(duì)的海邊》第二場(chǎng)live秀開啟 趙夢(mèng)為鄭秀妍寫中文歌詞

                  今日(11月25日),芒果TV女性經(jīng)營(yíng)勵(lì)志奮斗真人秀《樂隊(duì)的海邊》第二期即將上線。張儷、趙夢(mèng)、鄭秀妍、于文文、劉戀、張?zhí)鞇墼诤D鲜…偤J薪?jīng)營(yíng)的“炸廚”音樂餐廳蒸蒸日上,收獲顧客滿滿…

                  2022年11月25日
                • 自由的工作

                  02我國(guó)把自由職業(yè)者分為三類第一類是小本生意人,如個(gè)體零售店小餐館印刷店裝修公司老板,還有路邊小攤經(jīng)營(yíng)者第二類是沒有底薪的推銷員,如買保險(xiǎn)的人地產(chǎn)經(jīng)紀(jì)房子中介直銷人士,賣卡的人。 …

                  2022年11月25日
                • cpu性能天梯圖2022 AMD CPU天梯圖最新排行榜出爐

                  用戶在DIY自己的主機(jī)時(shí)選擇CPU是非常關(guān)鍵的,CPU可以說是電腦的大腦,大家也都想追求好一點(diǎn)的CPU來(lái)使用,但型號(hào)太多了,大部分的用戶都不知道目前哪一款CPU比較好用,快來(lái)看看詳…

                  2022年11月24日
                • 本人由于個(gè)人原因辭職30字(最簡(jiǎn)單的個(gè)人辭職原因)

                  做人留一線,日后好相見!我們不斷地被職場(chǎng)潛規(guī)則著,同時(shí)也在制造一些潛規(guī)則,每一個(gè)離職理由的背后都有一段難以言說的辛酸!離職的時(shí)候如果不想說明真實(shí)原因,究竟該怎么說合適呢?1、 想讀…

                  2022年11月24日
                • 忻府區(qū)疫情預(yù)計(jì)什么時(shí)候解封(忻府區(qū)疫情防控指揮部)

                  忻州忻府區(qū)本輪疫情發(fā)生至今,高風(fēng)險(xiǎn)區(qū)一直新增不斷,也讓大家非常擔(dān)心當(dāng)?shù)氐囊咔椤W钚峦ǜ?,針?duì)忻府區(qū)當(dāng)前疫情防控形勢(shì),忻府區(qū)新冠肺炎疫情防控工作應(yīng)急處置指揮部決定,11月22日在全區(qū)…

                  2022年11月22日
                • 11月20日八師石河子市發(fā)現(xiàn)2例無(wú)癥狀感染者

                  11月20日0—24時(shí),新疆生產(chǎn)建設(shè)兵團(tuán)第八師石河子市在對(duì)外地貨車司機(jī)核酸檢測(cè)時(shí),發(fā)現(xiàn)2例核酸檢測(cè)初篩異常人員。其中,1例為外地進(jìn)入師市貨車司機(jī)“落地核酸檢測(cè)”發(fā)現(xiàn),1例為石河子高…

                  2022年11月21日
                • 二十條發(fā)布后,各地防控政策都有哪些新調(diào)整?看這里→

                  11月11日,國(guó)務(wù)院聯(lián)防聯(lián)控機(jī)制綜合組發(fā)布《關(guān)于進(jìn)一步優(yōu)化新冠肺炎疫情防控措施 科學(xué)精準(zhǔn)做好防控工作的通知》,公布進(jìn)一步優(yōu)化防控工作的“二十條措施”?!岸畻l措施”發(fā)布后,北京市、…

                  2022年11月21日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息