執行緒池例項講解(原創)

2022-05-06 16:48:09 字數 3899 閱讀 8333

最近老看一些伺服器閘道器的**頁看了一些開源的**。乙個重要的技術執行緒池。

何為執行緒池,所謂執行緒池就是一組用來處理,客戶請求的執行緒組 這裡的客戶指代的是執行緒池服務的物件。

執行緒池的實現原理:

(1)訊息佇列呼叫函式,當有訊息到來時候,將訊息封裝插入訊息佇列。

(2)有乙個 執行緒池附服務執行緒,該執行緒負責檢索訊息佇列,建立執行緒池執行緒,將該訊息派發到執行緒池的某一線程處理。

(3)執行緒池執行緒引數,該引數應該是乙個結構體,該結構體中某項指向乙個訊息,處理完成之後刪除訊息,進入等待狀態。

源**如下 **注釋有說明 故不在單獨講解**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7 #include 8 #include 9 #include 10

1112

//訊息佇列基本元素

13 typedef struct _stpoolmsgelement //

訊息佇列基本元素

14stpoolmsgdata,*pstpoolmsgdata;

1920

21//

執行緒池基本元素

22 typedef struct

_stpoolthreadelement

23stpoolthreadelement,*pstpoolthreadelement;

3132

//變數定義

33//

訊息佇列肯定有頭有尾頭出尾巴進 多個執行緒要訪問必須有同步 以及初始化

34 pstpoolmsgdata pstmsgquequebegin =null;

35 pstpoolmsgdata pstmsgquequeend =null;

36 pthread_mutex_t queueaccess ;//

= pthread_mutex_initializer;

37 pthread_cond_t queueempty; //

= pthread_cond_initializer;

3839

//執行緒池鍊錶 執行緒池的執行緒不管先後順序,每次任務來了檢索空閒執行緒,派遣任務

40 pstpoolthreadelement pstpool =null;

4142

//先來看訊息佇列相關函式 訊息插入函式 負責訊息封裝插入訊息佇列

43void insertmsg(char *pmsg)

4455

strcpy(pmsgdupli,pmsg);

56 pmsgdata->param =pmsgdupli;

57 pmsgdata->next =null;

5859

//插入訊息

60 pthread_mutex_lock(&queueaccess);

61if

(pstmsgquequeend)

6265 pstmsgquequeend =pmsgdata;

6667

if (!pstmsgquequebegin)

6871

72 pthread_cond_broadcast(&queueempty); //

通知訊息分發執行緒有訊息到來

73 pthread_mutex_unlock(&queueaccess);74}

7576

77//

再來看看訊息取出函式 採用阻塞模式,因為沒有訊息的時候所有執行緒都處於空閒狀態

78pstpoolmsgdata getnextmsg()

7993 result->next =null;

94 pthread_mutex_unlock(&queueaccess);

95return

result;96}

9798

99//

接下來看執行緒池執行緒

100void *poolldealmsgthread(pstpoolthreadelement listelement)

101119 pthread_mutex_unlock(&listelement->busy);

120pthread_exit(null);

121return

null;

122}

123124

125//

接著看看執行緒池服務執行緒 這裡呼叫dispatchmsg 函式分發訊息

126void

dispatchmsg(pstpoolmsgdata pmsgdata)

127143 cur->pmsgdata =pmsgdata;

144 pthread_cond_broadcast(&cur->nodata); //

通知執行緒池執行緒有事件到來

145 pthread_mutex_unlock(&cur->busy);

146return

;147

}148

}149

//新建執行緒處理訊息

150 cur = (pstpoolthreadelement)malloc(sizeof

(stpoolthreadelement));

151if(!cur)

152157

158 memset(cur,0,sizeof

(stpoolthreadelement));

159160 pthread_mutex_init(&cur->busy, null);

161 pthread_cond_init(&cur->nodata, null);

162 cur->pmsgdata =pmsgdata;

163 cur->next =null;

164 result = pthread_create(&cur->thread, null, (void *(*)(void *)) poolldealmsgthread, cur);

165166

if (0 !=result)

167173

//新執行緒插入執行緒池

174 cur->next =pstpool;

175 pstpool =cur;

176}

177178

179void *queuedealfuction(void *data)

180187

return

null;

188}

189190

//好了基本執行緒池模型已經構建完畢 現在看看主函式

191char testmsg[5][10] = ;

197198

intmain()

199210

//這裡訊息僅代表字串

211for(i=0 ;i < 5 ;i++)

212215 sleep(10

);216

return0;

217 }

編譯gcc -g  main.c -lpthread  -o main

連續執行程式三次 三次結果如下:

由此可以得知如要順序處理訊息,這種方式不使用於執行緒池。

一些技巧:

執行緒池常用於伺服器網路程式設計,執行緒池引數中往往攜帶輸出socket ,當我們處理完訊息後,將結果通過socket 傳送給客戶端。

如:web伺服器,載入生成xml檔案,通過socket 傳送給客戶端。

KKB 執行緒池 四個執行緒池講解

如果併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,我們就需要頻繁的建立執行緒和銷毀執行緒,降低系統的效率。執行緒池就是乙個容納多個執行緒的容器,池中的執行緒可以反覆使用,省去了頻繁建立執行緒物件的操作,節省了時間和資源 長度無限制 執行流程 判斷執行緒池是否存在空閒執行緒 ...

執行緒 執行緒池 執行緒同步 例項

執行緒 using system using system.collections.generic using system.text using system.threading namespace 執行緒thread public void threadmain data static void...

ThreadLocal執行緒池例項

學習了多執行緒的理論後,下面我們來看工作中遇到的乙個具體例項。public integer startareaindex listactivityids arealist if collectionutils.isempty arealist logtypeenum.activity solr.in...