亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++實現簡單的線程池

2020-05-23 14:13:09
字體:
來源:轉載
供稿:網友

這里給大家介紹了C++中對于pthread線程的一個簡單應用以及使用繼承CDoit,實現其中的start和end,有需要的小伙伴可以參考下

這是對pthread線程的一個簡單應用

1. 實現了線程池的概念,線程可以重復使用。

2. 對信號量,互斥鎖等進行封裝,業務處理函數中只需寫和業務相關的代碼。

3. 移植性好。如果想把這個線程池代碼應用到自己的實現中去,只要寫自己的業務處理函數和改寫工作隊列數據的處理方法就可以了。

Sample代碼主要包括一個主程序和兩個線程實現類

ThreadTest.cpp:主程序

CThreadManager:線程管理Class,線程池的實現類

CThread:線程Class.

主程序實現方法。

1. 實現main函數和一個需要線程處理的業務函數(例子代碼中業務函數是一個簡單的計算函數Count)。在main函數中創建CThreadManager的實例,產生線程池。這個時候,把業務函數作為函數指針傳到CThreadManager里面,最終會被線程調用。

2. 向工作隊列中放入業務函數要處理的數據。

3. 設置信號量,喚醒線程。

 

 
  1. // 線程要執行的函數 
  2. int Count(int nWork) 
  3. int nResult = nWork * nWork; 
  4. printf("count result is %d/n",nResult); 
  5. return 0; 
  6. int main() { 
  7. // 創建線程管理類的實例,把要執行的線程函數和最大線程數傳進去 
  8. CThreadManager* pManager = new CThreadManager(Count, 3); 
  9. // 把要進行計算的數放到工作隊列中 
  10. pManager->PushWorkQue(5); 
  11. pManager->PushWorkQue(20); 
  12. // 設置信號量,喚醒線程 
  13. pManager->PostSem(); 
  14. pManager->PostSem(); 
  15. // 等待子線程執行 
  16. sleep(1); 
  17. return 0; 

CThreadManager實現的方法

1. 把信號量和互斥鎖等封裝成自己的函數

2. 在new方法里,循環調用CThread的new方法,啟動一定數量(可設定)的線程,產生線程池。

3. 這些線程啟動后,就會執行CThreadManager中的ManageFuction函數。這個函數是無限循環的,保證了線程在整個程序的生命周期中不銷毀。

4. 在循環處理里面,第一行代碼就是等待一個信號量,這個信號量是由主程序進行設置的,這個信號信號量如果沒有被設置(代表暫時沒有需要處理的工作),所有線程都在這里阻塞著。

4. 一旦信號量被設置,根據Linux線程調度機制,在阻塞的線程隊列中,其中一個線程被喚醒,可以執行后面的代碼。

5. 從工作隊列中取出要進行處理的數據(使用互斥鎖進行排他)

6. 通過函數指針調用main函數傳過來的業務函數,處理數據。

7. 業務函數執行完之后,線程進入下一個循環,等待新的信號量。

 

 
  1. class CThreadManager { 
  2. friend void* ManageFuction(void*); 
  3. private
  4. sem_t m_sem; // 信號量 
  5. pthread_mutex_t m_mutex; // 互斥鎖 
  6. queue<int> m_queWork; // 工作隊列 
  7. list<CThread*> m_lstThread; // 線程list 
  8. int (*m_threadFuction)(int); //函數指針,指向main函數傳過來的線程執行函數 
  9. public
  10. CThreadManager(int (*threadFuction)(int), int nMaxThreadCnt); 
  11. virtual ~CThreadManager(); 
  12. int WaitSem(); 
  13. int PostSem(); 
  14. int LockMutex(); 
  15. int UnlockMutex(); 
  16. void PushWorkQue(int nWork); 
  17. int PopWorkQue(); 
  18. int RunThreadFunction(int nWork); 
  19. }; 
  20. // 線程執行函數,它只是個殼子,處理信號量和互斥鎖等, 
  21. // 最后調用main函數傳過來的線程執行函數來實現業務處理 
  22. void* ManageFuction(void* argv) 
  23. CThreadManager* pManager = (CThreadManager*)argv; 
  24. // 進行無限循環(意味著線程是不銷毀的,重復利用) 
  25. while(true
  26. // 線程開啟后,就在這里阻塞著,直到main函數設置了信號量 
  27. pManager->WaitSem(); 
  28. printf("thread wakeup./n"); 
  29. // 從工作隊列中取出要處理的數 
  30. pManager->LockMutex(); 
  31. int nWork = pManager->PopWorkQue(); 
  32. pManager->UnlockMutex(); 
  33. printf("call Count function./n"); 
  34. pManager->RunThreadFunction(nWork); 
  35. return 0; 
  36. // 構造方法 
  37. CThreadManager::CThreadManager(int (*threadFuction)(int), int nMaxThreadCnt)  
  38. sem_init(&m_sem, 0, 0); 
  39. pthread_mutex_init(&m_mutex, NULL); 
  40. m_threadFuction = threadFuction; 
  41. for(int i=0; i<nMaxThreadCnt; i++) 
  42. CThread* pThread = new CThread(ManageFuction, this); 
  43. printf("thread started./n"); 
  44. m_lstThread.push_back(pThread); 

CThread實現的方法

CThreadManager比較簡單,封裝了創建線程和join線程的函數。

 

 
  1. CThread::CThread(void* (*threadFuction)(void*),void* threadArgv)  
  2. // 初始化線程屬性 
  3. pthread_attr_t threadAttr; 
  4. pthread_attr_init(&threadAttr); 
  5.  
  6. pthread_create(&m_thread, &threadAttr, threadFuction, threadArgv); 

c++線程池,繼承CDoit,實現其中的start和end

 

 
  1. /* 
  2. * 多線程管理類 
  3.  
  4. */ 
  5.  
  6. #ifndef CTHREADPOOLMANAGE_H 
  7. #define CTHREADPOOLMANAGE_H 
  8. #include <iostream> 
  9. #include <pthread.h> 
  10. #include <unistd.h>  
  11. #include <list> 
  12. #include <vector> 
  13. #include <time.h> 
  14. #include <asm/errno.h> 
  15.  
  16. #define USLEEP_TIME 100 
  17. #define CHECK_TIME 1 
  18.  
  19.  
  20. using namespace std; 
  21. class CDoit 
  22. public
  23. virtual int start(void *){}; 
  24. virtual int end(){}; 
  25. }; 
  26.  
  27.  
  28. class CthreadPoolManage 
  29. private
  30. int _minThreads; //最少保留幾個線程 
  31. int _maxThreads; //最多可以有幾個線程 
  32. int _waitSec; //空閑多少秒后將線程關閉 
  33. class threadInfo{ 
  34. public
  35. threadInfo(){ 
  36. isbusy = false;  
  37. doFlag = true
  38. // 
  39. pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER; 
  40. pthread_cond_t cond=PTHREAD_COND_INITIALIZER; 
  41. bool isbusy; //是否空閑 
  42. bool doFlag; 
  43. // 
  44. time_t beginTime; //線程不工作開始時間 
  45. pthread_t cThreadPid; //線程id 
  46. pthread_attr_t cThreadAttr; //線程屬性 
  47. CDoit * doit; //任務類 
  48. void * value; //需要傳遞的值 
  49. }; 
  50. //線程函數 
  51. static void* startThread(void*); 
  52. //任務隊列鎖 
  53. pthread_mutex_t _duty_mutex; 
  54. //任務隊列 
  55. list<threadInfo*> _dutyList; 
  56. //線程隊列鎖 
  57. pthread_mutex_t _thread_mutex; 
  58. //線程隊列 
  59. list<threadInfo*> _threadList; 
  60.  
  61. ///初始化,創建最小個數線程/// 
  62. void initThread();  
  63. ///任務分配線程/// 
  64. static void* taskAllocation(void*arg); 
  65. pthread_t tasktPid; 
  66. ///線程銷毀、狀態檢查線程/// 
  67. static void* checkThread(void* arg); 
  68. pthread_t checktPid; 
  69. bool checkrun; 
  70.  
  71. //線程異常退出清理 
  72. static void threadCleanUp(void* arg); 
  73.  
  74. // 
  75. int addThread(list<threadInfo*> *plist,threadInfo* ptinfo); 
  76.  
  77. public
  78. CthreadPoolManage(); 
  79. /* 
  80. 保留的最少線程,最多線程數,空閑多久銷毀,保留幾個線程的冗余 
  81. */ 
  82. CthreadPoolManage(int min,int max,int waitSec); 
  83. ~CthreadPoolManage(); 
  84.  
  85. int start(); 
  86. //任務注入器 
  87. int putDuty(CDoit *,void *); 
  88.  
  89. int getNowThreadNum(); 
  90.  
  91. }; 
  92.  
  93. #endif // CTHREADPOOLMANAGE_H 

CPP

 

 
  1. /* 
  2. * 線程池,線程管理類 
  3.  
  4. */ 
  5.  
  6. #include "cthreadpoolmanage.h" 
  7.  
  8. CthreadPoolManage::CthreadPoolManage() 
  9. _minThreads = 5; //最少保留幾個線程 
  10. _maxThreads = 5; //最多可以有幾個線程 
  11. _waitSec = 10; //空閑多少秒后將線程關閉 
  12. pthread_mutex_init(&_duty_mutex, NULL); 
  13. pthread_mutex_init(&_thread_mutex, NULL); 
  14. checkrun = true
  15.  
  16.  
  17. CthreadPoolManage::CthreadPoolManage(int min, int max, int waitSec) 
  18. CthreadPoolManage(); 
  19. _minThreads = min; //最少保留幾個線程 
  20. _maxThreads = max; //最多可以有幾個線程 
  21. _waitSec = waitSec; //空閑多少秒后將線程關閉 
  22.  
  23. CthreadPoolManage::~CthreadPoolManage() 
  24.  
  25. void CthreadPoolManage::threadCleanUp(void* arg) 
  26. threadInfo* tinfo = (threadInfo*)arg; 
  27. tinfo->isbusy = false
  28. pthread_mutex_unlock(&tinfo->mtx); 
  29. pthread_attr_destroy (&tinfo->cThreadAttr); 
  30. delete tinfo; 
  31.  
  32. void* CthreadPoolManage::startThread(void* arg) 
  33. cout<<"線程開始工作"<<endl; 
  34. threadInfo* tinfo = (threadInfo*)arg; 
  35. pthread_cleanup_push(threadCleanUp,arg); 
  36. while(tinfo->doFlag){ 
  37. pthread_mutex_lock(&tinfo->mtx); 
  38. if(tinfo->doit == NULL) 
  39. cout<<"開始等待任務"<<endl; 
  40. pthread_cond_wait(&tinfo->cond,&tinfo->mtx); 
  41. cout<<"有任務了"<<endl; 
  42. tinfo->isbusy = true
  43. tinfo->doit->start(tinfo->value); 
  44. tinfo->doit->end(); 
  45. tinfo->doit=NULL; 
  46. tinfo->isbusy = false
  47. time( &tinfo->beginTime); 
  48. pthread_mutex_unlock(&tinfo->mtx); 
  49. //0正常執行到這兒不執行清理函數,異常會執行 
  50. pthread_cleanup_pop(0); 
  51. pthread_attr_destroy (&tinfo->cThreadAttr); 
  52. delete tinfo; 
  53. cout<<"線程結束"<<endl; 
  54.  
  55. void CthreadPoolManage::initThread() 
  56. int i = 0; 
  57. for(i = 0;i<this->_minThreads;i++) 
  58. threadInfo *tinfo = new threadInfo; 
  59. tinfo->doit = NULL; 
  60. tinfo->value = NULL; 
  61. tinfo->isbusy = false
  62. tinfo->doFlag = true
  63. // PTHREAD_CREATE_DETACHED (分離線程) 和 PTHREAD _CREATE_JOINABLE (非分離線程) 
  64. pthread_attr_init(&tinfo->cThreadAttr); 
  65. pthread_attr_setdetachstate(&tinfo->cThreadAttr,PTHREAD_CREATE_DETACHED ); 
  66. cout<<"初始化了一個線程"<<endl; 
  67. if(pthread_create(&tinfo->cThreadPid,&tinfo->cThreadAttr,startThread,(void *)tinfo) != 0) 
  68. cout<<"創建線程失敗"<<endl; 
  69. break
  70. this->_threadList.push_back(tinfo); 
  71.  
  72. int CthreadPoolManage::addThread(std::list< CthreadPoolManage::threadInfo* >* plist, CthreadPoolManage::threadInfo* ptinfo) 
  73. threadInfo *tinfo = new threadInfo; 
  74. tinfo->doit = ptinfo->doit; 
  75. tinfo->value = ptinfo->value; 
  76. tinfo->isbusy = true
  77. if(pthread_create(&tinfo->cThreadPid,NULL,startThread,(void *)tinfo) != 0) 
  78. cout<<"創建線程失敗"<<endl; 
  79. return -1; 
  80. plist->push_back(tinfo); 
  81. return 0; 
  82.  
  83.  
  84. int CthreadPoolManage::putDuty(CDoit* doit, void* value) 
  85. threadInfo *tinfo = new threadInfo; 
  86. time( &tinfo->beginTime); 
  87. tinfo->doit= doit; 
  88. tinfo->value = value; 
  89. pthread_mutex_lock(&_duty_mutex); 
  90. this->_dutyList.push_back(tinfo); 
  91. pthread_mutex_unlock(&_duty_mutex); 
  92. return 0; 
  93.  
  94. void* CthreadPoolManage::taskAllocation(void*arg) 
  95. CthreadPoolManage * ptmanage = (CthreadPoolManage*)arg; 
  96. int size_1 = 0; 
  97. int size_2 = 0; 
  98. int i_1 = 0; 
  99. int i_2 = 0; 
  100. bool a_1 = true
  101. bool a_2 = true
  102. threadInfo* ptinfo; 
  103. threadInfo* ptinfoTmp; 
  104. while(true){ 
  105. size_1 = 0; 
  106. size_2 = 0; 
  107. pthread_mutex_lock(&ptmanage->_duty_mutex); 
  108. pthread_mutex_lock(&ptmanage->_thread_mutex); 
  109. size_1 = ptmanage->_dutyList.size(); 
  110. size_2 =ptmanage->_threadList.size(); 
  111. for(list<threadInfo*>::iterator itorti1 = ptmanage->_dutyList.begin();itorti1 !=ptmanage->_dutyList.end();) 
  112. ptinfo = *itorti1; 
  113. a_1 = true
  114. for(list<threadInfo*>::iterator itorti2 = ptmanage->_threadList.begin();itorti2!=ptmanage->_threadList.end();itorti2++){ 
  115. ptinfoTmp = *itorti2; 
  116. if(EBUSY == pthread_mutex_trylock(&ptinfoTmp->mtx)) 
  117. continue
  118. if(!ptinfoTmp->isbusy) 
  119. ptinfoTmp->doit = ptinfo->doit; 
  120. ptinfoTmp->value = ptinfo->value; 
  121. ptinfoTmp->isbusy = true
  122. pthread_cond_signal(&ptinfoTmp->cond); 
  123. pthread_mutex_unlock(&ptinfoTmp->mtx); 
  124. a_1 = false
  125. delete ptinfo; 
  126. break
  127. pthread_mutex_unlock(&ptinfoTmp->mtx); 
  128. if(a_1){ 
  129. if(ptmanage->_threadList.size()>ptmanage->_maxThreads||ptmanage->addThread(&ptmanage->_threadList,ptinfo)!=0) 
  130. itorti1++; 
  131. continue
  132. }else
  133. itorti1 = ptmanage->_dutyList.erase(itorti1); 
  134. delete ptinfo; 
  135. }else
  136. itorti1 = ptmanage->_dutyList.erase(itorti1); 
  137. pthread_mutex_unlock(&ptmanage->_duty_mutex); 
  138. pthread_mutex_unlock(&ptmanage->_thread_mutex); 
  139. usleep(USLEEP_TIME); 
  140. return 0; 
  141.  
  142. void* CthreadPoolManage::checkThread(void* arg) 
  143. CthreadPoolManage * ptmanage = (CthreadPoolManage*)arg; 
  144. threadInfo* ptinfo; 
  145. time_t nowtime; 
  146. while(ptmanage->checkrun){ 
  147. sleep(CHECK_TIME); 
  148. pthread_mutex_lock(&ptmanage->_thread_mutex); 
  149. if(ptmanage->_threadList.size()<=ptmanage->_minThreads) 
  150. pthread_mutex_unlock(&ptmanage->_thread_mutex); 
  151. continue
  152. for(list<threadInfo*>::iterator itorti2 = ptmanage->_threadList.begin();itorti2!=ptmanage->_threadList.end();){ 
  153. ptinfo = *itorti2; 
  154. if(EBUSY == pthread_mutex_trylock(&ptinfo->mtx)) 
  155. itorti2++; 
  156. continue
  157. time(&nowtime); 
  158. if(ptinfo->isbusy == false && nowtime-ptinfo->beginTime>ptmanage->_waitSec) 
  159. ptinfo->doFlag = false
  160. itorti2 = ptmanage->_threadList.erase(itorti2); 
  161. }else
  162. itorti2++; 
  163. pthread_mutex_unlock(&ptinfo->mtx); 
  164. pthread_mutex_unlock(&ptmanage->_thread_mutex); 
  165.  
  166. int CthreadPoolManage::start() 
  167. //初始化 
  168. this->initThread(); 
  169. //啟動任務分配線程 
  170. if(pthread_create(&tasktPid,NULL,taskAllocation,(void *)this) != 0) 
  171. cout<<"創建任務分配線程失敗"<<endl; 
  172. return -1; 
  173. //創建現程狀態分配管理線程 
  174. if(pthread_create(&checktPid,NULL,checkThread,(void *)this) != 0) 
  175. cout<<"創建線程狀態分配管理線程失敗"<<endl; 
  176. return -1; 
  177. return 0; 
  178.  
  179. /////////////////////////////// 
  180. int CthreadPoolManage::getNowThreadNum() 
  181. int num = 0; 
  182. pthread_mutex_lock(&this->_thread_mutex); 
  183. num = this->_threadList.size(); 
  184. pthread_mutex_unlock(&this->_thread_mutex); 
  185. return num ; 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区在线免费视频| 中文字幕久久亚洲| 久久精品国产96久久久香蕉| 亚洲精品综合久久中文字幕| 欧美成人精品在线播放| 在线观看国产精品91| 国产91在线播放九色快色| 日韩av快播网址| 国产精品一区二区三区久久| 国产成人在线一区二区| 欧美国产一区二区三区| 午夜免费久久久久| 久久视频在线看| 欧美另类高清videos| 丝袜亚洲另类欧美重口| 少妇高潮 亚洲精品| 北条麻妃一区二区三区中文字幕| 亚洲男人天堂2019| 午夜剧场成人观在线视频免费观看| 精品久久久久久中文字幕大豆网| 久久精品国产清自在天天线| 色香阁99久久精品久久久| 欧美一级片久久久久久久| 欧美成人三级视频网站| 国产一区二区三区中文| 亚洲欧洲国产精品| 国产精品一区二区久久国产| 欧美俄罗斯性视频| 欧美激情视频网址| 午夜精品久久久99热福利| 国产va免费精品高清在线| 欧美另类xxx| 国产日韩在线一区| 亚洲直播在线一区| yw.139尤物在线精品视频| 国产精品视频免费观看www| 亚洲国产精品久久精品怡红院| 九九视频这里只有精品| 97碰在线观看| 伊人激情综合网| 日韩欧美在线网址| 欧美成人性色生活仑片| 亚洲成人a**站| 精品久久久一区二区| 91社影院在线观看| 久久久av免费| 伊人久久精品视频| 欧美一级电影免费在线观看| 欧美xxxx做受欧美.88| 国产一区二区在线免费视频| 国产色视频一区| 久久视频精品在线| 亚洲精品乱码久久久久久金桔影视| 欧美国产精品人人做人人爱| 亚洲国产精品久久久久久| 亚洲免费影视第一页| 精品视频9999| 日韩视频亚洲视频| 久久伊人免费视频| 成人精品视频在线| 日韩国产在线看| 91精品视频在线播放| 欧美成人精品一区二区三区| 亚洲欧美一区二区三区在线| 成人av在线亚洲| 成人精品福利视频| 日韩精品在线观看网站| 亚洲深夜福利视频| 蜜臀久久99精品久久久久久宅男| 91精品国产一区| 97**国产露脸精品国产| 欧美在线视频观看| 国产一区二区三区丝袜| 中文字幕在线日韩| 国产美女精品视频免费观看| 成人免费黄色网| 88国产精品欧美一区二区三区| 亚洲精品一区中文字幕乱码| 成人网在线免费看| 欧美视频不卡中文| 久久影院中文字幕| 日韩美女在线观看| 91精品国产综合久久香蕉922| 精品国模在线视频| 欧美性xxxx| 国产精品一区二区三区免费视频| www.欧美精品一二三区| 91成品人片a无限观看| 国产第一区电影| 高清日韩电视剧大全免费播放在线观看| 欧美另类老女人| 亚洲精品天天看| 亚洲国产精品va在看黑人| 中国人与牲禽动交精品| 欧美在线观看www| 久久综合国产精品台湾中文娱乐网| 国产精品欧美在线| 亚洲欧美中文日韩v在线观看| 亚洲欧美综合图区| 91色视频在线观看| 欧美成人午夜激情| 成人欧美一区二区三区在线| 欧美激情videos| 精品久久久久久国产| 97久久精品人搡人人玩| 欧美激情亚洲国产| 亚洲激情视频在线| 欧美日韩中文在线观看| 川上优av一区二区线观看| 日本免费久久高清视频| 日韩av日韩在线观看| 精品国产91乱高清在线观看| 日韩电影免费观看中文字幕| 国产精品亚洲一区二区三区| 91久久精品视频| 在线电影欧美日韩一区二区私密| 亚洲欧美精品一区| 欧美性猛交xxxx富婆弯腰| 国产精品国产三级国产aⅴ9色| 日韩的一区二区| 成人在线小视频| 日韩成人在线网站| 欧美视频精品一区| 亚洲人成自拍网站| 97超碰色婷婷| 丝袜美腿精品国产二区| 日韩成人中文字幕| 国产精品大陆在线观看| 日本亚洲精品在线观看| 精品久久久香蕉免费精品视频| 97激碰免费视频| 欧美黑人xxxⅹ高潮交| 久久免费视频这里只有精品| 国产精品7m视频| 国产日韩欧美视频在线| 亚洲国产精品va在线| 有码中文亚洲精品| 国产精品xxx视频| 欧美国产日韩一区二区| 欧美大肥婆大肥bbbbb| 亚洲精品国产精品国产自| 久久久久久亚洲精品不卡| 综合国产在线视频| 久久久噜噜噜久久中文字免| 亚洲自拍欧美另类| 久久久电影免费观看完整版| xxxxxxxxx欧美| 91a在线视频| 不卡av日日日| 91国语精品自产拍在线观看性色| 日韩电影网在线| 日本成人精品在线| 日韩二区三区在线| 欧美夫妻性生活xx| 欧美激情xxxx性bbbb| 精品亚洲一区二区三区四区五区| 国产精品aaa| 91黑丝高跟在线| 亚洲精品欧美一区二区三区| 国模精品视频一区二区三区| 欧美大奶子在线| 亚洲欧美国产制服动漫| 欧美日韩中文字幕综合视频| 亚洲人成网7777777国产|