一.功能
執行緒池中有若干個執行緒,用於執行大量相對短暫的任務
二.功能描述
計算密集型任務:執行緒池中線程個數=cpu個數
i/o密集型任務:執行緒池中線程個數》cpu個數
當任務增加時,可以動態增加執行緒池中線程個數,當任務執行完成後,可以動態減少執行緒池中線程個數
運用生產消費者模型,生產者執行緒向任務佇列中新增任務,任務佇列中如果沒有任務,如果有等待執行緒就喚醒並執行任務,如果執行緒池中沒有等待執行緒並且沒有達到上限,就新增新的執行緒到執行緒池
三.**梳理
main.c
建立執行緒池 -->初始化執行緒池-->不斷向執行緒池中新增任務-->銷毀執行緒池
執行緒池的結構
// 任務佇列(鍊錶)
typedef struct tasktask_t;
//互斥量
typedef struct condition condition_t;
typedef struct threadpool threadpool_t;
threadpool.h所做的工作
1)初始化執行緒池
2)執行執行緒池中的任務(建立執行緒時傳參傳執行緒池的結構體)
a)上鎖
b)空閒執行緒個數+1 ?
c)如果此時任務隊列為空,等待新增任務
d)因為此時執行緒將要執行任務,所以空閒執行緒-1
e)如果此時任務佇列不為空
1>取此時任務佇列的隊頭
2>防止任務執行太久,解鎖
3>執行任務
4>上鎖,釋放原來的隊頭,解鎖
3)向執行緒池中新增任務
a)生成任務結點 task_t
b)上鎖(對鍊錶進行的動作都要上鎖)
c)判斷隊頭是否為空,採用尾插,更新尾巴
d)如果有空閒執行緒,傳送signal,或者執行緒個數小於最大執行緒個數,增加執行緒。
e)解鎖
4)銷毀執行緒池
銷毀互斥量和條件變數
上**:
1 #include 2 #include 3 #include 4 #include "cond.h"
5 6 #define max 15
7 8 //任務佇列
9 typedef struct tasttask_t;
14 15 //執行緒池
16 typedef struct threadpoolthreadpool_t;
24 25
26 void threadpool_init(threadpool_t *pool);
27 void* myroute(void *arg);
28 void threadpool_add(threadpool_t *pool,void*(*pfun1)(void *),void *arg1);
29 void threadpool_destroy(threadpool_t *pool);
1 #include "thread.h"
2 3 void threadpool_init(threadpool_t *pool)
11 12 void* myroute(void *arg)
20 pool->idle--;
21 22 if(pool->first!=null)
31 cond_unlock(&pool->cond);
32 }
33 }
34 35 void threadpool_add(threadpool_t *pool,void*(*pfun1)(void *),void *arg1)else
46 pool->tail=new;
47
48 if(pool->idle>0)else if(pool->countermax_thread)
55 cond_unlock(&pool->cond);
56 }
57 58 void threadpool_destroy(threadpool_t *pool)
condition.c
1 #include 2
3 //互斥量
4 typedef struct conditioncondition_t;
1 #include "cond.h"
2 3 void cond_init(condition_t *condi)
7 8 void cond_lock(condition_t *condi)
11 12 void cond_unlock(condition_t *condi)
15 16 void cond_wait(condition_t *condi)
19 20 void cond_signal(condition_t *condi)
23 24 void cond_destroy(condition_t *condi)
main.c
1 #include 2 #include 3 #include "thread.h"
4 5
6 void * route(void * arg)
12 13 int main(void)
22 sleep(15);
23 threadpool_destroy(&pool);
24 }
Linux執行緒池
linux下通用執行緒池的建立與使用 本文給出了乙個通用的執行緒池框架,該框架將與執行緒執行相關的任務進行了高層次的抽象,使之與具體的執行任務無關。另外該執行緒池具有動態伸縮性,它能根據執行任務的輕重自動調整執行緒池中線程的數量。文章的最後,我們給出乙個簡單示例程式,通過該示例程式,我們會發現,通過...
Linux 執行緒池
首先,執行緒池是什麼?顧名思義,就是把一堆開闢好的執行緒放在乙個池子裡統一管理,就是乙個執行緒池。其次,為什麼要用執行緒池,難道來乙個請求給它申請乙個執行緒,請求處理完了釋放執行緒不行麼?也行,但是如果建立執行緒和銷毀執行緒的時間比執行緒處理請求的時間長,而且請求很多的情況下,我們的cpu資源都浪費...
Linux 執行緒池
基礎概念 include include using namespace std include include include class task task void setdata int x,int y int run class threadpool void unlockqueue bo...