執行緒池實現:
用於執行大量相對短暫的任務
當任務增加的時候能夠動態的增加執行緒池中線程的數量直到達到乙個閾值。
當任務執行完畢的時候,能夠動態的銷毀執行緒池中的執行緒
該執行緒池的實現本質上也是生產者與消費模型的應用。生產者執行緒向任務佇列中新增任務,一旦佇列有任務到來,如果有等待執行緒就喚醒來執行任務,如果沒有等待執行緒並且執行緒數沒有達到閾值,就建立新執行緒來執行任務。
contion.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_h_ */
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
#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
void *thread_routine(void *arg)
}// 等待到條件,處於工作狀態
pool->idle--;
// 等待到任務
if (pool->first != null)
// 如果等待到執行緒池銷毀通知, 且任務都執行完畢
if (pool->quit && pool->first == null)
if (timeout && pool->first == null)
condition_unlock(&pool->ready);
}printf("thread 0x%x is exting\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)
condition_unlock(&pool->ready);
}// 銷毀執行緒池
void threadpool_destroy(threadpool_t *pool)
condition_lock(&pool->ready);
pool->quit = 1;
if (pool->counter > 0)
condition_unlock(&pool->ready);
condition_destroy(&pool->ready);
}main.c
#include "threadpool.h"
#include
#include
#include
void* mytask(void *arg)
int main(void)
//sleep(15);
threadpool_destroy(&pool);
return 0;
}makefile:
.phony:clean
cc=gcc
cflags=-wall -g
all=main
all:$(all)
objs=threadpool.o main.o condition.o
.c.o:
$(cc) $(cflags) -c $<
main:$(objs)
$(cc) $(cflags) $^ -o $@ -lpthread -lrt
clean:
rm -f $(all) *.o
執行緒池(一) 實現乙個簡單的執行緒池
我們知道頻繁的建立 銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 5 個執行緒。那我們執行緒池裡只有五個執行緒能同時工作,那同時...
乙個簡單的執行緒池實現
乙個linux下簡單的執行緒池實現 實現了大部分邏輯,有部分邏輯未實現,只是提供乙個思路 執行緒池類 threadpool.h created on oct 13,2016 author luokun ifndef threadpool h define threadpool h include i...
Linux C 乙個執行緒池的簡單實現
這是對pthread執行緒的乙個簡單應用 1.實現了執行緒池的概念,執行緒可以重複使用。2.對訊號量,互斥鎖等進行封裝,業務處理函式中只需寫和業務相關的 3.移植性好。如果想把這個執行緒池 應用到自己的實現中去,只要寫自己的業務處理函式和改寫工作佇列資料的處理方法就可以了。sample 主要包括乙個...