執行緒池,簡單來說就是有一堆已經建立好的執行緒(最大數目一定),初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務產生,只能等待執行緒池中有執行緒結束任務空閒才能執行,下面是執行緒池的工作原理圖:
我們為什麼要使用執行緒池呢?
簡單來說就是執行緒本身存在開銷,我們利用多執行緒來進行任務處理,單執行緒也不能濫用,無止禁的開新執行緒會給系統產生大量消耗,而執行緒本來就是可重用的資源,不需要每次使用時都進行初始化,因此可以採用有限的執行緒個數處理無限的任務。
廢話少說,直接上**
首先是用條件變數和互斥量封裝的乙個狀態,用於保護執行緒池的狀態
condition.h
#ifndef _condition_h_condition.c#define _condition_h_#include
//封裝乙個互斥量和條件變數作為狀態
typedef struct
condition
condition_t;
//對狀態的操作函式
int condition_init(condition_t *cond);
int condition_lock(condition_t *cond);
int condition_unlock(condition_t *cond);
int condition_wait(condition_t *cond);
int condition_timedwait(condition_t *cond, const
struct timespec *abstime);
int condition_signal(condition_t*cond);
int condition_broadcast(condition_t *cond);
int condition_destroy(condition_t *cond);
#endif
#include "然後是執行緒池對應的threadpool.h和threadpool.ccondition.h"//
初始化int condition_init(condition_t *cond)
//加鎖
int condition_lock(condition_t *cond)
//解鎖
int condition_unlock(condition_t *cond)
//等待
int condition_wait(condition_t *cond)
//固定時間等待
int condition_timedwait(condition_t *cond, const
struct timespec *abstime)
//喚醒乙個睡眠執行緒
int condition_signal(condition_t*cond)
//喚醒所有睡眠執行緒
int condition_broadcast(condition_t *cond)
//釋放
int condition_destroy(condition_t *cond)
#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
#include "測試**:threadpool.h
"#include
#include
#include
#include
#include
//建立的執行緒執行
void *thread_routine(void *arg)
}pool->idle--;
if(pool->first !=null)
//退出執行緒池
if(pool->quit && pool->first ==null)
condition_unlock(&pool->ready);
break
; }
//超時,跳出銷毀執行緒
if(timeout == 1
)
condition_unlock(&pool->ready);
}printf(
"thread %d is exiting\n
", (int
)pthread_self());
return
null;
}//執行緒池初始化
void threadpool_init(threadpool_t *pool, int
threads)
//增加乙個任務到執行緒池
void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg)
else
pool->last = newtask; //
佇列尾指向新加入的執行緒
//執行緒池中有執行緒空閒,喚醒
if(pool->idle > 0
)
//當前執行緒池中線程個數沒有達到設定的最大值,建立乙個新的線性
else
if(pool->counter < pool->max_threads)
//結束,訪問
condition_unlock(&pool->ready);}//
執行緒池銷毀
void threadpool_destroy(threadpool_t *pool)
//加鎖
condition_lock(&pool->ready);
//設定銷毀標記為1
pool->quit = 1
;
//執行緒池中線程個數大於0
if(pool->counter > 0
)
//正在執行任務的執行緒,等待他們結束任務
while(pool->counter)
}condition_unlock(&pool->ready);
condition_destroy(&pool->ready);
}
#include "輸出結果:threadpool.h
"#include
#include
#include
void* mytask(void *arg)
//測試**
int main(void
) threadpool_destroy(&pool);
return0;
}
可以看出程式先後建立了三個執行緒進行工作,當沒有任務空閒時,等待2s直接退出銷毀執行緒
C 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...
c 簡單執行緒池實現
boost threadpool參考 執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒...
c 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...