任務佇列的任務會交給執行緒池的執行緒來處理。這當中主要運用到的是訊號量和條件變數來實現執行緒的阻塞和接任務。下面我分成了三部分:伺服器(任務佇列)、客戶端、執行緒池。
當任務佇列不為空,且沒有滿的時候:
當任務佇列的任務超出以建好執行緒數量時:再建立出多個執行緒。
下面是**書寫時候的主要流程,和具體的操作
main檔案
主要作用:建立執行緒池,接受客戶端的申請,每個客戶端接入就往任務列表中加入乙個任務。
#include
"threadpool.h"
#include
#include
#include
//每個客戶端建立出來的任務
void
*mytask
(void
*arg)
intmain
(void
)//sleep(15);
threadpool_destroy
(pool)
;return0;
}
condition.h和condition.c檔案
作用:這兩個檔案只要是提供條件變數和互斥鎖的使用方法。
condition.**件
#ifndef _condition_h_
#define _condition_h_
#include
//定義乙個專門儲藏互斥鎖和條件變數的結構體
typedef
struct condition
condition_t;
//結構體初始化
intcondition_init
(condition_t *cond)
;//互斥鎖上所
intcondition_lock
(condition_t *cond)
;//互斥鎖解鎖
intcondition_unlock
(condition_t *cond)
;//條件變數等待
intcondition_wait
(condition_t *cond)
;//條件變數輪詢等待
intcondition_timedwait
(condition_t *cond,
const
struct timespec *abstime)
;//條件變數喚醒
intcondition_signal
(condition_t *cond)
;//條件變數廣播(全部喚醒)
intcondition_broadcast
(condition_t *cond)
;//條件變數和互斥量銷毀
intcondition_destroy
(condition_t *cond)
;#endif
/* _condition_h_ */
condition.c檔案
#include
"condition.h"
//互斥鎖、條件變數初始化
intcondition_init
(condition_t *cond)
//互斥鎖加鎖
intcondition_lock
(condition_t *cond)
//互斥鎖解鎖
intcondition_unlock
(condition_t *cond)
//條件變數等待
intcondition_wait
(condition_t *cond)
//條件變數輪詢等待
intcondition_timedwait
(condition_t *cond,
const
struct timespec *abstime)
//條件變數喚醒
intcondition_signal
(condition_t *cond)
//條件變數和互斥鎖銷毀
intcondition_destroy
(condition_t* cond)
threadpool.**件
#ifndef _thread_pool_h_
#define _thread_pool_h_
#include
"condition.h"
// 任務結構體,將任務放入佇列由執行緒池中的執行緒來執行
typedef
struct task
task_t;
// 執行緒池結構體
typedef
struct threadpool
threadpool_t;
// 初始化執行緒池
void
threadpool_init
(threadpool_t *
*pool,
int threads)
;// 往執行緒池中新增任務
void
threadpool_add_task
(threadpool_t *pool,
void*(
*run)
(void
*arg)
,void
*arg)
;// 銷毀執行緒池
void
threadpool_destroy
(threadpool_t *pool)
;#endif
/* _thread_pool_h_ */
threadpool.c檔案
#include
"threadpool.h"
#include
#include
#include
#include
#include
#include
void
*thread_routine
(void
*arg)
else
if(pool->quit)
//2. 如果沒有任務,則等待
printf
("thread 0x%x is waiting\n",(
int)
pthread_self()
);while(1
)else}}
//最裡層while結束
}//最外層while結束
thread_exit:
printf
("thread 0x%x 退出\n",(
int)
pthread_self()
);condition_lock
(&pool->ready)
; pool->counter--
;condition_unlock
(&pool->ready)
;pthread_exit
(null);
//退出執行緒
}//初始化執行緒池結構體
void
threadpool_init
(threadpool_t *
*pool,
int threads)
}#endif
}void
threadpool_add_task
(threadpool_t *pool,
void*(
*run)
(void
*arg)
,void
*arg)
else
//3. 計算一下執行緒數是否滿足任務處理速度,不滿足則建立一批
if(pool->counter < pool->max_threads && pool->idle <=0)
//當前執行緒數《最大執行緒數,且空閒線<=0
}//4. 通知執行緒去取任務處理
if(pool->idle >0)
//5. 解鎖
condition_unlock
(&pool->ready);}
void
threadpool_destroy
(threadpool_t *pool)
//4. 銷毀執行緒池物件
free
(pool)
;}
Linux 網路程式設計 9 執行緒池
任務佇列 que t 條件變數 pthread cond t 互斥鎖 pthread mutex t 啟動狀態startflag 執行緒id 執行緒數量 1.主線程 初始化執行緒池init 啟動執行緒池 tcpinit,監聽埠,等待客戶端連線,客戶端連線後,得到newfd,建立佇列的節點,儲存new...
網路程式設計 執行緒池
在乙個池子裡,放固定數量的執行緒,這些執行緒等待任務,一旦有任務來,就有執行緒自發的去執行任務。concurrent.futures 這個模組是非同步呼叫的機制 concurrent.futures 提交任務都是用submit for submit 多個任務的提交 shutdown 是等效於pool...
《Linux系統程式設計 執行緒池》
在傳統伺服器結構中,常是有乙個總的監聽執行緒監聽有沒有新的使用者連線伺服器,每當有乙個新的使用者進入,伺服器就開啟乙個新的執行緒使用者處理這 個使用者的資料報。這個執行緒只服務於這個使用者,當使用者與伺服器端關閉連線以後,伺服器端銷毀這個執行緒。然而頻繁地開闢與銷毀執行緒極大地占用了系統的資源,而且...