在高併發場景、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...