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

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

C++線程池的簡單實現方法

2020-01-26 15:20:58
字體:
來源:轉載
供稿:網友

本文以實例形式較為詳細的講述了C++線程池的簡單實現方法。分享給大家供大家參考之用。具體方法如下:

一、幾個基本的線程函數:

1.線程操縱函數:

int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void *), void *arg); //創建void pthread_exit(void *retval);            //終止自身int pthread_cancel(pthread_t tid);            //終止其他.發送終止信號后目標線程不一定終止,要調用join函數等待int pthread_join(pthread_t tid, void **retval);   //阻塞并等待其他線程

2.屬性:

int pthread_attr_init(pthread_attr_t *attr);           //初始化屬性int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); //設置分離狀態int pthread_attr_destroy(pthread_attr_t *attr);           //銷毀屬性

 

3.同步函數
互斥鎖

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); //初始化鎖int pthread_mutex_destroy(pthread_mutex_t *mutex); //銷毀鎖int pthread_mutex_lock(pthread_mutex_t *mutex); //加鎖int pthread_mutex_trylock(pthread_mutex_t *mutex); //嘗試加鎖,上面lock的非阻塞版本int pthread_mutex_unlock(pthread_mutex_t *mutex); //解鎖

4.條件變量

int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr); //初始化int pthread_cond_destroy(pthread_cond_t *cond);                 //銷毀 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);     //等待條件int pthread_cond_signal(pthread_cond_t *cond);                 //通知,喚醒第一個調用pthread_cond_wait()而進入睡眠的線程

5.工具函數

int pthread_equal(pthread_t t1, pthread_t t2); //比較線程IDint pthread_detach(pthread_t tid);       //分離線程pthread_t pthread_self(void);            //自身ID

上述代碼中,線程的cancel和join,以及最后的工具函數,這些函數的參數都為結構體變量,其他的函數參數都是結構體變量指針;品味一下,參數為指針的,因為都需要改變結構體的內容,而參數為普通變量的,則只需要讀內容即可。

二、線程池代碼:

#include <stdio.h>#include <stdlib.h>#include <pthread.h>  //linux環境中多線程的頭文件,非C語言標準庫,編譯時最后要加 -lpthread 調用動態鏈接庫//工作鏈表的結構typedef struct worker {  void *(*process)(void *arg);  //工作函數  void *arg;           //函數的參數  struct worker *next;}CThread_worker;//線程池的結構typedef struct {  pthread_mutex_t queue_lock;   //互斥鎖  pthread_cond_t queue_ready;  //條件變量/信號量  CThread_worker *queue_head;   //指向工作鏈表的頭結點,臨界區  int cur_queue_size;       //記錄鏈表中工作的數量,臨界區  int max_thread_num;       //最大線程數  pthread_t *threadid;      //線程ID  int shutdown;          //開關}CThread_pool;static CThread_pool *pool = NULL;  //一個線程池變量int pool_add_worker(void *(*process)(void *arg), void *arg);  //負責向工作鏈表中添加工作void *thread_routine(void *arg);  //線程例程//線程池初始化void pool_init(int max_thread_num){  int i = 0;  pool = (CThread_pool *) malloc (sizeof(CThread_pool));  //創建線程池  pthread_mutex_init(&(pool->queue_lock), NULL);   //互斥鎖初始化,參數為鎖的地址  pthread_cond_init( &(pool->queue_ready), NULL);   //條件變量初始化,參數為變量地址  pool->queue_head = NULL;  pool->cur_queue_size = 0;  pool->max_thread_num = max_thread_num;  pool->threadid = (pthread_t *) malloc(max_thread_num * sizeof(pthread_t));  for (i = 0; i < max_thread_num; i++) {    pthread_create(&(pool->threadid[i]), NULL, thread_routine, NULL); //創建線程, 參數為線程ID變量地址、屬性、例程、參數  }  pool->shutdown = 0;}//例程,調用具體的工作函數void *thread_routine(void *arg){  printf("starting thread 0x%x/n", (int)pthread_self());  while(1) {    pthread_mutex_lock(&(pool->queue_lock));  //從工作鏈表中取工作,要先加互斥鎖,參數為鎖地址    while(pool->cur_queue_size == 0 && !pool->shutdown) {    //鏈表為空      printf("thread 0x%x is waiting/n", (int)pthread_self());      pthread_cond_wait(&(pool->queue_ready), &(pool->queue_lock));  //等待資源,信號量用于通知。會釋放第二個參數的鎖,以供添加;函數返回時重新加鎖。    }    if(pool->shutdown) {      pthread_mutex_unlock(&(pool->queue_lock));     //結束開關開啟,釋放鎖并退出線程      printf("thread 0x%x will exit/n", (int)pthread_self());      pthread_exit(NULL);   //參數為void *    }    printf("thread 0x%x is starting to work/n", (int)pthread_self());    --pool->cur_queue_size;    CThread_worker *worker = pool->queue_head;    pool->queue_head = worker->next;    pthread_mutex_unlock (&(pool->queue_lock));   //獲取一個工作后釋放鎖    (*(worker->process))(worker->arg);   //做工作    free(worker);    worker = NULL;  }  pthread_exit(NULL);}//銷毀線程池int pool_destroy(){  if(pool->shutdown)   //檢測結束開關是否開啟,若開啟,則所有線程會自動退出    return -1;  pool->shutdown = 1;  pthread_cond_broadcast( &(pool->queue_ready) );   //廣播,喚醒所有線程,準備退出  int i;  for(i = 0; i < pool->max_thread_num; ++i)    pthread_join(pool->threadid[i], NULL);   //主線程等待所有線程退出,只有join第一個參數不是指針,第二個參數類型是void **,接收exit的返回值,需要強制轉換  free(pool->threadid);  CThread_worker *head = NULL;  while(pool->queue_head != NULL) {      //釋放未執行的工作鏈表剩余結點    head = pool->queue_head;    pool->queue_head = pool->queue_head->next;    free(head);  }  pthread_mutex_destroy(&(pool->queue_lock));   //銷毀鎖和條件變量  pthread_cond_destroy(&(pool->queue_ready));  free(pool);  pool=NULL;  return 0;}void *myprocess(void *arg){  printf("threadid is 0x%x, working on task %d/n", (int)pthread_self(), *(int*)arg);  sleep (1);  return NULL;}//添加工作int pool_add_worker(void *(*process)(void *arg), void *arg){  CThread_worker *newworker = (CThread_worker *) malloc(sizeof(CThread_worker));  newworker->process = process;  //具體的工作函數  newworker->arg = arg;  newworker->next = NULL;  pthread_mutex_lock( &(pool->queue_lock) );   //加鎖  CThread_worker *member = pool->queue_head;   //插入鏈表尾部  if( member != NULL ) {    while( member->next != NULL )      member = member->next;    member->next = newworker;  }  else {    pool->queue_head = newworker;  }  ++pool->cur_queue_size;  pthread_mutex_unlock( &(pool->queue_lock) );  //解鎖  pthread_cond_signal( &(pool->queue_ready) );  //通知一個等待的線程  return 0;}int main(int argc, char **argv){  pool_init(3);  //主線程創建線程池,3個線程  int *workingnum = (int *) malloc(sizeof(int) * 10);  int i;  for(i = 0; i < 10; ++i) {    workingnum[i] = i;    pool_add_worker(myprocess, &workingnum[i]);   //主線程負責添加工作,10個工作  }  sleep (5);  pool_destroy();   //銷毀線程池  free (workingnum);  return 0;}

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产小视频在线观看| 欧美一区第一页| 亚洲午夜未满十八勿入免费观看全集| 亚洲第一天堂av| 欧美日韩亚洲91| 午夜精品久久久久久久99黑人| 亚洲视频综合网| 日韩av一区在线观看| 在线国产精品视频| 久久久久久一区二区三区| 日韩精品中文字幕视频在线| 亚洲色图国产精品| 91日本视频在线| 久久久综合免费视频| 亚洲精品动漫100p| 国产精品美女在线观看| 亚洲免费电影在线观看| 91精品国产免费久久久久久| 日韩在线观看视频免费| 上原亚衣av一区二区三区| 亚洲国产中文字幕久久网| 国产日韩欧美日韩大片| 91中文精品字幕在线视频| 日韩在线免费视频观看| 亚洲精品永久免费精品| 国产精品视频地址| 亚洲va欧美va国产综合久久| 亚洲精品综合精品自拍| 欧美夫妻性视频| 伊人一区二区三区久久精品| 国产成人精品在线视频| 亚洲美女av黄| 欧美性xxxx极品高清hd直播| 欧美激情伊人电影| 亚洲天堂影视av| www.日韩.com| 国产亚洲日本欧美韩国| 日韩有码在线观看| 欧美在线影院在线视频| 亚洲精品福利资源站| 奇门遁甲1982国语版免费观看高清| 国产成人亚洲精品| 中文字幕亚洲无线码在线一区| 欧美激情va永久在线播放| 久久久久日韩精品久久久男男| 亚洲成人精品视频在线观看| 欧美黑人一级爽快片淫片高清| 欧美成年人在线观看| 国产丝袜高跟一区| 欧美中文在线免费| 91免费视频网站| 亚洲精品国产拍免费91在线| 91麻豆国产精品| 成人激情视频在线观看| 国产一区二区黑人欧美xxxx| 欧美激情精品久久久| 福利一区福利二区微拍刺激| 久久躁日日躁aaaaxxxx| 97香蕉久久超级碰碰高清版| 九色成人免费视频| 国内精品久久久久久影视8| 狠狠色狠狠色综合日日五| 最新69国产成人精品视频免费| 亚洲视频在线免费看| 日韩中文字幕在线| 亚洲精品456在线播放狼人| 91视频国产精品| 日韩最新免费不卡| 国内揄拍国内精品| 亚洲欧美一区二区三区四区| 日韩在线精品一区| 亚洲区bt下载| 97视频在线看| 久久777国产线看观看精品| 欧美激情视频免费观看| 国产精品久久久久久久久久新婚| 日本在线精品视频| 国产欧美在线观看| 欧美超级免费视 在线| 国产视频精品免费播放| 欧美与黑人午夜性猛交久久久| 91丝袜美腿美女视频网站| 亚洲美女又黄又爽在线观看| 国产一区私人高清影院| 欧洲s码亚洲m码精品一区| 欧美另类极品videosbestfree| 一区二区三区精品99久久| 国产丝袜一区二区三区| 日韩精品高清视频| 欧美成人中文字幕在线| 美女av一区二区三区| 亚洲电影成人av99爱色| 国产精品成人观看视频国产奇米| 亚洲最大激情中文字幕| 国产精品狠色婷| 国产日韩欧美在线视频观看| 亚洲第一网站男人都懂| 日韩精品视频在线观看网址| 欧美亚洲国产日韩2020| 欧美日韩美女视频| 久久久久久久影院| 久久99精品久久久久久琪琪| 免费成人高清视频| 国产视频久久久久久久| 92福利视频午夜1000合集在线观看| 久久黄色av网站| 亚洲黄页网在线观看| 国产精品自拍小视频| 77777少妇光屁股久久一区| 狠狠做深爱婷婷久久综合一区| 国产精品久久一区主播| 久久精品国产一区二区三区| 日本久久久久久久久| 9.1国产丝袜在线观看| 日韩中文字幕在线免费观看| 成人xvideos免费视频| 国产精品普通话| 久久五月天色综合| 日韩国产欧美精品一区二区三区| 久久91亚洲精品中文字幕奶水| 亚洲色图13p| 亚洲图片欧洲图片av| 亚洲成avwww人| 亚洲激情在线观看视频免费| 91久久久久久国产精品| 欧美大片在线看| 欧美电影免费观看电视剧大全| 国产在线拍偷自揄拍精品| 欧美亚洲第一页| 日韩国产高清视频在线| 国产福利视频一区| 亚洲欧美日韩精品久久亚洲区| 欧美在线观看网址综合| 国产精品嫩草影院一区二区| 国外视频精品毛片| 欧美性xxxxx极品娇小| 国产精品第1页| 成人精品网站在线观看| 国产成人精品a视频一区www| 国产精品av在线播放| 在线观看欧美www| 欧美电影免费观看高清完整| 亚洲综合色激情五月| 国产精品电影网| 中文字幕免费国产精品| 亚洲综合精品一区二区| 日韩一区二区三区国产| 91chinesevideo永久地址| 中文字幕日韩电影| 亚洲男人天堂视频| 8050国产精品久久久久久| 国产亚洲人成网站在线观看| 亚洲成人激情在线观看| 欧美自拍大量在线观看| 亚洲综合在线小说| xxav国产精品美女主播| 精品久久久久久电影| 日韩电影免费在线观看中文字幕| 亚洲成人网av| 亚洲欧美国产日韩中文字幕| 国产精品美女久久久免费| 国产欧美日韩91| 欧美日韩另类在线| 亚洲国产欧美在线成人app|