執行緒池,簡單來說就是有一堆已經建立好的執行緒(最大數目一定),初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務產生,只能等待執行緒池中有執行緒結束任務空閒才能執行,下面是執行緒池的工作原理圖:
我們為什麼要使用執行緒池呢?
簡單來說就是執行緒本身存在開銷,我們利用多執行緒來進行任務處理,單執行緒也不能濫用,無止禁的開新執行緒會給系統產生大量消耗,而執行緒本來就是可重用的資源,不需要每次使用時都進行初始化,因此可以採用有限的執行緒個數處理無限的任務。
廢話少說,直接上**
首先是用條件變數和互斥量封裝的乙個狀態,用於保護執行緒池的狀態
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 "condition.h"然後是執行緒池對應的threadpool.h和threadpool.c//初始化
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);
return 0;
}
可以看出程式先後建立了三個執行緒進行工作,當沒有任務空閒時,等待2s直接退出銷毀執行緒
C 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...
c 簡單執行緒池實現
boost threadpool參考 執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒...
c 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...