執行緒池的實現 自動擴容與刪減

2021-10-14 12:29:25 字數 3595 閱讀 6599

在高併發場景、io密集型時我們往往需要建立多線成去執行相應的任務,但往往頻繁地去建立和銷毀執行緒會影響整個系統的效能,因此提前建立好執行緒池,當有任務時,直接丟進執行緒池裡去執行就可以了,而不用再另外建立執行緒

工作元件(消費者):維護執行緒佇列,執行相應的任務(callback)

任務元件(生產者):維護任務佇列

管理元件:管理執行緒池,將任務從任務佇列中取出加入到執行緒佇列裡

乙個工作元件即為乙個執行緒

typedef

struct _nworker nworker;

typedef

struct _njob njob;

typedef

struct _nmanager nmanager;

#include

#include

#include

#include

#include

#define ll_add(item, list) do while (0)

#define ll_remove(item, list) do while (0)

typedef

struct _nworker nworker;

typedef

struct _njob njob;

typedef

struct _nmanager nmanager;

typedef nmanager nthreadpool;

intextendthreadpool

(nthreadpool *pool)

;int

reducethreadpool

(nthreadpool *pool)

;void

*nworkercallback

(void

*arg)

worker->pool->free_thread--;if

(worker->terminate ==1)

njob *job = worker->pool->jobs;

if(job !=

null

)pthread_mutex_unlock

(&worker->pool->jobs_mtx);if

(job ==

null

)extendthreadpool

(worker->pool)

; job->

func

(job->user_data)

;pthread_mutex_lock

(&worker->pool->jobs_mtx)

; worker->pool->free_thread++

;pthread_mutex_unlock

(&worker->pool->jobs_mtx)

;free

(job)

;reducethreadpool

(worker->pool);}

ll_remove

(worker, worker->pool->workers)

;free

(worker);}

intnthtreadpoolcreate

(nthreadpool *pool,

int numworkers)

memset

(worker,0,

sizeof

(nworker));

worker->pool = pool;if(

pthread_create

(&worker->threadid,

null

, nworkercallback, worker)!=0

)return2;

}ll_add

(worker, pool->workers)

; pool->max_thread++

; pool->free_thread = pool->max_thread;

}return0;

}int

extendthreadpool

(nthreadpool *pool)

memset

(worker,0,

sizeof

(nworker));

worker->pool = pool;if(

pthread_create

(&worker->threadid,

null

, nworkercallback, worker)!=0

)return2;

}ll_add

(worker, pool->workers)

; max =

++pool->max_thread;

free =

++pool->free_thread;

}pthread_mutex_unlock

(&pool->jobs_mtx)

;return0;

}int

reducethreadpool

(nthreadpool *pool)

if(w !=

null)}

pthread_mutex_unlock

(&pool->jobs_mtx);}

intnthreadpooldestory

(nthreadpool *pool)

pthread_mutex_lock

(&pool->jobs_mtx)

;pthread_cond_broadcast

(&pool->jobs_cond)

;pthread_mutex_unlock

(&pool->jobs_mtx);}

intnthreadpoolpushjob

(nthreadpool *pool, njob *job)

intnjobcreate

(nthreadpool *pool,

void

*callback,

void

*arg)

void

hellofunc

(void

*arg)

intmain()

;for

(i =

0; i <

sizeof

(count)

/sizeof

(count[0]

); i++

)sleep(5

);pthread_mutex_lock

(&pool.jobs_mtx)

;printf

("+++ func: %s, line: %d +++, max: %d, free: %d\n"

, __function__,

__line__

, pool.max_thread, pool.free_thread)

;pthread_mutex_unlock

(&pool.jobs_mtx)

;while(1

);return0;

}

執行緒池的實現

為什麼要使用執行緒池 因為執行緒的建立和銷毀佔了大量的cpu等系統資源,使用執行緒池可以解決這種情況,提高伺服器的效能。執行緒池的思想 1 先在記憶體中開闢出一些數目固定的執行緒。2 當請求到達時,從執行緒池中選擇乙個空閒的執行緒來服務,服務完成時,執行緒放入執行緒池。3 當請求到答時,將請求放到任...

std string與執行緒安全 C 實現執行緒池

平時注入一滴水,難時擁有太平洋。池化技術,通俗來講,就是提前儲存大量預分配資源,以備不時之需。執行緒池是一種多執行緒處理方式,其維護著多個執行緒,由監督者進行可併發任務的分配執行,從而避免了處理短任務時建立 銷毀程序的代價。執行緒池的必要性 多執行緒技術主要用以解決處理器單元內多個執行緒併發執行的問...

C 多執行緒的自動管理 執行緒池

c 多執行緒的自動管理 執行緒池 在多執行緒的程式中,經常會出現兩種情況 1.應用程式中線程把大部分的時間花費在等待狀態,等待某個事件發生,然後給予響應。這一般使用 threadpool 執行緒池 來解決。2.執行緒平時都處於休眠狀態,只是周期性地被喚醒。這一般使用 timer 定時器 來解決。th...