C 簡單執行緒池實現

2021-08-28 07:05:42 字數 3862 閱讀 6965

執行緒池,簡單來說就是有一堆已經建立好的執行緒(最大數目一定),初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務產生,只能等待執行緒池中有執行緒結束任務空閒才能執行,下面是執行緒池的工作原理圖:

我們為什麼要使用執行緒池呢?

簡單來說就是執行緒本身存在開銷,我們利用多執行緒來進行任務處理,單執行緒也不能濫用,無止禁的開新執行緒會給系統產生大量消耗,而執行緒本來就是可重用的資源,不需要每次使用時都進行初始化,因此可以採用有限的執行緒個數處理無限的任務。

廢話少說,直接上**

首先是用條件變數和互斥量封裝的乙個狀態,用於保護執行緒池的狀態

condition.h

#ifndef _condition_h_

#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

condition.c

#include "condition.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)

然後是執行緒池對應的threadpool.h和threadpool.c

#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 簡單執行緒池實現

boost threadpool參考 執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒...

c 簡單執行緒池實現

執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...

c 簡單執行緒池實現

執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...