国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

掰開揉碎了教你設計線程池!還不來學?

開發 前端
池的概念是一種非常常見的空間換時間的概念,除了有線程池之外還有進程池、內存池等等。其實他們的思想都是一樣的就是我先申請一批資源出來,然后就隨用隨拿,不用再放回來。聽到這兒是不是有種云計算的思想了,他們道理都是一樣的。

[[438359]]

大家好,我是作者小杰,我在學習線程池的時候也曾查閱過各種資料,但是感覺大佬寫的很好但是寫的不夠詳細,寫的詳細的設計思路又很簡單,所以我的出發點就是讓讀者可以清晰明確的看懂整個設計思想和設計過程,可以舉一反三,在今后內存池等方面也可以游刃有余的設計出來!好了,正文開始~

線程池設計思路

線程池是什么

我們先來打個比方,線程池就好像一個工具箱,我們每次需要擰螺絲的時候都要從工具箱里面取出一個螺絲刀來,有時候需要取出一個來擰,有時候螺絲多的時候需要多個人取出多個來擰,擰完自己的螺絲那么就會把螺絲刀再放回去,然后別人下次用的時候再取出來用。也許我的例子不是太完美,但是我想我已經基本闡述清楚了線程池。說白了線程池就是相當于提前申請了一些資源也就是線程,需要的時候就從線程池中取出線程來處理一些事情,處理完畢之后再把線程放回去。

線程池介紹

為什么需要線程池

我們來思考一個問題,為什么需要線程池呢?假如沒有線程池的話我們每次調用線程是什么樣子的?顯然首先是先創建一個線程,然后再把任務交給這個線程,最后再把這個線程銷毀掉。那么如果我們改用線程池的話,我們在程序運行的時候就會首先創建一批線程,然后交給線程池來管理。有需要的時候我們把線程拿出去處理任務,不需要的時候我們再回收到線程池中,這樣是不是就避免了每次都需要創建和銷毀線程這種消耗時間的操作。有人會說你使用線程池一開始就消耗了一些內存,之后一直不釋放這些內存,這樣豈不是有點浪費。其實這是類似于空間換時間的概念,我們確實多占用了一點內存但是這些內存和我們珍惜出來的這些時間相比,是非常劃算的。

池的概念是一種非常常見的空間換時間的概念,除了有線程池之外還有進程池、內存池等等。其實他們的思想都是一樣的就是我先申請一批資源出來,然后就隨用隨拿,不用再放回來。聽到這兒是不是有種云計算的思想了,他們道理都是一樣的。

如何設計線程池

現在硬核的知識要開始了,請坐穩扶好、抓緊扶手~

二話不說,先上圖看看,我們要設計的線程池長什么樣子!

線程池的設計

設計思路

我們需要一個線程池類,那么線程池類中都需要哪些東西呢?我們庖丁解牛來看一看

  • 我們需要存放我們創建好的線程,因此我們需要一個容器專門放線程
  • 需要一個容器來存放我們的任務,每次把任務放到這個容器里面
  • 由于是多線程的讀取任務,所以必不可少的我們需要鎖,每次讀取任務需要加鎖和解鎖
  • 我們需要判斷什么時候終止,因此還需要一個判斷終止的變量

為了避免輪詢的判斷任務集裝箱里面是不是空的,這樣效率太低了,因此我們這里采用條件變量

這里來說明一下什么是條件變量。條件變量是并發編程中的一種同步機制,條件變量使得線程能夠阻塞到等待某個條件發生后,再繼續執行,期間還會把之前拿到的鎖先釋放掉,不影響其它人拿這把鎖。因此條件變量十分強大而高效。(條件變量和鎖將會在我多線程文章中詳細講解,這里不是重點,所以不再展開細講)

接下來我們來研究一下線程池中需要有哪些操作呢?

  • 將任務添加到線程池中的操作,并且這時應該通知線程可以來取任務來執行了
  • 一個循環操作,不斷地等待任務集裝箱里面有數據來執行,也就是初始化完畢后需要做的事情
  • 通過改變終止變量來讓上面循環停止的操作

好了,到此已經詳細的把設計思路寫清楚了,接下來該看具體的實現了

線程池的實現

接下來先來看一看線程池類是怎么實現的,注釋已經很詳細了,就不多說了直接上代碼。

  1. class CThreadMangerPool 
  2. public
  3.  CThreadMangerPool(void):is_runing(false){}; 
  4.  bool init(int threadnum);//初始化函數 
  5.  ~CThreadMangerPool(void); 
  6.  void Run(void);  //執行函數 
  7.  void stop(void); //用來終止循環的函數 
  8.  void addTask(ThreadTask* task);//向任務集裝箱中添加任務的函數 
  9. private: 
  10.  bool CreateThreads(int threadnum = 5); 
  11.  std::vector<std::shared_ptr<std::thread>> threadsPool;    //線程集裝箱,用來存放線程 
  12.  std::list<std::shared_ptr<ThreadTask>>    threadTaskList; //任務集裝箱,用來存放線程執行的任務 
  13.  std::condition_variable       threadPool_cv;  //條件變量 
  14.  std::mutex          threadMutex;   //互斥鎖 
  15.  //std::vector<std::shared_ptr<CTcpClient>>  tcpClients; 
  16.  bool is_runing; //終止變量 
  17. }; 

我們來幾個重點的函數實現~

在Run函數中,我們設計了一個循環,不斷地執行等待并取出任務執行,如果沒有的任務可以執行的話就睡眠等待(用之前提到的條件變量來實現)

注意這里使用了一個手法,我們用while來判斷任務集裝箱中的數據是不是空的,是因為類似于進程的驚群現象,這里出現條件變量的虛假喚醒。(在這里并不是重點就不展開講了,會在我文章的多線程處詳細講解)

  1. void CThreadMangerPool::Run(){ 
  2.  std::shared_ptr<ThreadTask> task;  
  3.  while(true){ //處在循環中 
  4.  
  5.   std::unique_lock<std::mutex> guard(threadMutex);//利用RALL來管理鎖,不用手動釋放 
  6.  
  7.   while(threadTaskList.empty()){ // 這里防止條件變量的虛假喚醒,所以不用if判斷 
  8.    if (!is_runing) 
  9.     break; 
  10.    threadPool_cv.wait(guard); //條件變量的使用 
  11.   } 
  12.   if (!is_runing)  //同上 都是判斷如果未啟動或者調用了stop函數都會退出循環 
  13.    break; 
  14.  
  15.   task = threadTaskList.front(); //取出任務 
  16.   threadTaskList.pop_front(); //把任務從容器中拿走 
  17.  
  18.   if (task == NULL
  19.    continue
  20.  
  21.   task->DoIt(); //執行任務處理函數 
  22.   task.reset(); //重置指針 
  23.  } 
  24.  

接下來看看增加任務的函數是怎么實現的

  1. void CThreadMangerPool::addTask(ThreadTask* task){ 
  2.  std::shared_ptr<ThreadTask> ptr; //創建一個指向任務的智能指針 
  3.  ptr.reset(task); 
  4.  { 
  5.   std::lock_guard<std::mutex> guard(threadMutex);  //同樣是用RALL來管理鎖,免去手動釋放 
  6.   threadTaskList.push_back(ptr); //往任務集裝箱中添加任務 
  7.  } 
  8.  threadPool_cv.notify_all(); //通知線程可以執行了,就是喚醒剛才在條件變量處睡眠的條件 
  9.   

好了,重點函數已經看完了,其他的輕松就可以實現包括初始化函數,終止函數等等

 

完結撒花~

 

責任編輯:武曉燕 來源: 暢游碼海
相關推薦

2025-06-13 09:30:50

2025-04-09 08:21:10

2022-01-13 06:59:40

廣告Cookie項目

2023-08-09 09:03:49

CPU密集型運算

2013-05-23 15:59:00

線程池

2020-10-19 10:01:12

Nodejs線程池設計

2016-02-24 11:49:00

2024-11-06 09:39:52

2021-06-08 09:49:01

協程池Golang設計

2020-07-23 14:39:28

系統權限設計

2023-05-19 08:01:24

Key消費場景

2023-12-06 08:28:44

禮物系統用例圖

2013-08-12 11:18:00

2024-07-15 08:20:24

2022-09-19 18:32:22

函數編程語言

2024-10-16 10:11:52

2012-05-15 02:18:31

Java線程池

2020-12-10 08:24:40

線程池線程方法

2023-10-13 08:20:02

Spring線程池id

2025-11-14 09:37:40

點贊
收藏

51CTO技術棧公眾號

91国偷自产一区二区开放时间| 国产一区av在线| 欧美一区二区三区在线播放| 久久精品免视看国产成人| 五月天婷婷综合| 日韩av中文字幕第一页| 一区视频在线看| 欧美老女人性生活| 黄色毛片在线看| 久久一区二区视频| 色之综合天天综合色天天棕色| av一级亚洲| 精品久久一区二区三区| 在线观看黄色小视频| 国产三区在线成人av| 日韩免费三级| 日韩av三区| 亚洲欧美制服综合另类| 午夜免费视频在线国产| 亚洲愉拍自拍另类高清精品| 精品一区二区中文字幕| 久久精品国产色蜜蜜麻豆| 国产精品免费看一区二区三区| 成人h动漫免费观看网站| 亚洲精品国产电影| 欧美精品电影| 日本乱码高清不卡字幕| 天堂av免费观看| 欧美精彩视频一区二区三区| 在线成人性视频| 亚洲二区视频| 91精品国产综合久久香蕉的用户体验| 精品一区二区三区四区五区| 亚洲国产黄色片| 毛片在线看网站| 欧美日韩不卡在线| 成人jjav| 在线免费观看成人短视频| 欧美18—20岁hd第一次| 国产精品美女久久福利网站| 一本久道中文无码字幕av| 91色porny蝌蚪| www.国产二区| 成人一区二区三区在线观看| 亚洲最新在线| 国产一区在线不卡| 黄色录像特级片| 国产91精品一区二区| 国产a级片网站| 91麻豆精品秘密| 国产wwwxx| 国产亚洲一区二区三区在线观看| 久久久久久免费看| 91理论电影在线观看| 116极品美女午夜一级| 久久久久久一级片| 成年人视频在线网站| 一区二区三区视频在线看| 污视频网站免费看| 亚洲综合一区在线| 男女污污视频在线观看| 精品视频一区三区九区| 羞羞污视频在线观看| 日韩欧美一级精品久久| 草草视频在线| www国产91| 久草在线免费二| 午夜日韩在线电影| 日本h片在线观看| 精品国产拍在线观看| 三级电影一区| 在线观看视频黄色| 亚洲日穴在线视频| 国产精品久久久久久福利| 精品国产一区二区三区在线观看 | 日韩丝袜美女视频| 国产精品亲子伦av一区二区三区| 午夜精品久久久久久久男人的天堂 | 亚洲国产精品嫩草影院久久av| 99影视tv| 久久先锋资源网| 网友自拍视频在线| 久久久亚洲国产| 免费日韩av片| 爱爱永久免费视频| 亚洲国产精品高清久久久| 欧美a一欧美| 亚洲毛片aa| 五月综合激情网| 看片一区二区| 久久精品日产第一区二区三区| 国产三级精品网站| 婷婷综合在线| 国产av无码专区亚洲精品| 欧美视频一区二区三区四区| 免费观看亚洲天堂| 日韩亚洲视频在线| 亚洲高清视频的网址| 草莓视频成人appios| 国产精品国产精品| 中文字幕一区二区三区在线播放| 欧美6一10sex性hd| 91在线观看免费高清| 久久蜜桃一区二区| 黑人极品ⅴideos精品欧美棵| 国产99在线|中文| 91色在线porny| 国产美女高潮在线观看| 91在线看网站| 亚洲一级二级三级在线免费观看| 国产麻豆精品| 国产成人艳妇aa视频在线 | 国产精品第一| 蜜桃精品久久久久久久免费影院 | 成人网ww555视频免费看| 97人人干人人| 中文字幕一区二区三区乱码在线| www.成人爱| 亚洲欧洲国产日韩精品| 欧美手机在线视频| 99精品视频在线观看免费播放| xxxx18hd亚洲hd捆绑| 亚洲第一偷拍网| 亚洲一区一卡| 欧美成人三区| 岛国一区二区三区高清视频| 一区二区三区久久| 偷拍亚洲色图| www.久草| 清纯唯美亚洲激情| 亚洲免费观看高清完整版在线观看熊| 日韩精品中文字幕吗一区二区| 老太脱裤子让老头玩xxxxx| 国产视频亚洲精品| 韩日欧美一区二区三区| 污污网站在线观看| 日本一区二区三区视频免费看| 在线视频一区二区三区| 午夜久久黄色| 韩国福利在线| 91手机在线播放| 在线观看日韩一区| 一区在线视频观看| 精品美女在线观看视频在线观看| 精品乱码一区| 精品国产第一区二区三区观看体验 | 欧美激情综合在线| 亚洲一级大片| av美女在线| 国产日本欧美在线观看| 色噜噜狠狠成人网p站| 欧美日韩亚洲一区三区| yiren22综合网成人| 欧美成熟毛茸茸复古| 亚洲国产高潮在线观看| 国产一区二区久久| 国产美女亚洲精品7777| jlzzjlzz欧美大全| 亚洲一区二区三区香蕉| 91精品国产综合久久国产大片| 日本亚洲天堂网| 国产在线|日韩| 亚洲人成无码www久久久| 98精品国产高清在线xxxx天堂| 一区av在线播放| 欧美黄在线观看| 污污的网站在线免费观看| 一级日韩一区在线观看| 亚洲香蕉成视频在线观看| 26uuu久久天堂性欧美| 一区二区三区日本久久久| 欧美日韩伦理片| 一级黄色免费在线观看| 精品中文字幕乱| 激情亚洲一区二区三区四区| 亚洲女人av| 国产95亚洲| 亚州色图欧美色图| 亚洲午夜精品福利| 久久久综合av| 在线观看91精品国产入口| 久久 天天综合| 卡一精品卡二卡三网站乱码| 国产精品影院在线| 在线观看免费91| 97色在线视频观看| 色综合色狠狠综合色| 国产很黄免费观看久久| 精品免费一区二区| 麻豆免费在线| 黄色成人av| 欧美aaa在线观看| 国产精品免费福利| 亚洲精品一区二区三区福利| 国产视频一区不卡| 99国产精品久久久久久久成人热| 国产不卡精品| av网址在线| 日本夜爽爽一二区| 日本a在线天堂|