前言
任何一種設計方式的引入都會帶來額外的開支,是否使用,取決於能帶來多大的好處和能帶來多大的壞處,好處與壞處包括程式的效能、**的可讀性、**的可維護性、程式的開發效率等。
執行緒池適用場合:任務比較多,需要拉起大量執行緒來處理;任務的處理時間相對比較短,按照執行緒的週期t1(建立階段)、t2(執行階段)、t3(銷毀階段)來算,執行階段僅占用較少時間。
簡單的執行緒池通常有以下功能:預建立一定數量的執行緒;管理執行緒任務,當工作執行緒沒有事情可做時休眠自己;銷毀執行緒池。
複雜一些的執行緒池有額外的調節功能:管理執行緒池的上限;動態調節工作執行緒數量,當大量工作請求到來時增加工作執行緒,工作請求較少時銷毀部分執行緒。
內容部分
這次實現的是乙個簡單的執行緒池模型。
首先是執行緒池的標頭檔案定義:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9using
namespace std;
1011
struct thread_work
12 ;
1617
struct thread_pool
18 ;
2627 thread_pool* thread_pool_create(int ithreadnum);
28void thread_pool_destroy(thread_pool* thpool);
29int thread_pool_add_task(thread_pool* thpool, void*(*routine)(void*), void* arg);
30void* thread_routine(void* arg);
下面是執行緒池的實現:
1 #include "
threadpool.h"2
3 thread_pool* thread_pool_create(int ithreadmaxnum)
4 12 pool->imaxthreadnum = ithreadmaxnum;
13 pool->shutdown = false;
14if((iret=pthread_mutex_init(&pool->pool_mutex, null)) != 0)
15
20if((iret=pthread_cond_init(&pool->pool_cond, null)) != 0)
21
2627
for(int i = 0; i < ithreadmaxnum; i++)
28
36else
37
40 }
41return pool;
42 }
4344
int thread_pool_add_task(thread_pool* thpool, void*(*routine)(void*), void* arg)
45 57
58void thread_pool_destroy(thread_pool* thpool)
59 68 pthread_cond_broadcast(&(thpool->pool_cond));
69 pthread_mutex_unlock(&(thpool->pool_mutex));
70while(!thpool->pth_idqueue.empty())
71
75 pthread_mutex_destroy(&(thpool->pool_mutex));
76 pthread_cond_destroy(&(thpool->pool_cond));
77 delete thpool;
78 }
7980
void* thread_routine(void* pool)
81 87
while(1)
88
95if(p->shutdown)
96
100 thread_work work_f;
101 work_f = p->pth_workqueue.front();
102 p->pth_workqueue.pop();
103 pthread_mutex_unlock(&(p->pool_mutex));
104 work_f.routine(work_f.arg);
105 }
106 }
**都是基礎知識,大家應該都能理解。
下面是乙個測試的demo:
1 #include "
threadpool.h"2
3void* task(void* p)
4 10
11int main()
12 22 thread_pool_destroy(pool);
23 }
小結很簡單很好理解的一段**,我卻寫了大半天時間,手殘黨鑑定完畢。
簡單執行緒池類
簡單練習了一下 簡單實現了一下執行緒池類,增加對執行緒的理解和掌控。以後有時間再好好完善下,現在和大家分享下 include include include include include include include include include include include include...
簡單執行緒池實現
執行緒池可以處理多執行緒問題,只要將任務放到任務佇列中,執行緒池中的執行緒就會從佇列中取任務,以預設的優先順序開始執行,如果你的任務數大於正在工作的執行緒數,則執行緒池將會建立一根新的執行緒來輔助工作,但是永遠都不會超過執行緒池中線程的最大值。執行緒池的結構 pragma once include ...
簡單執行緒池實現
1.用於執行大量相對短暫的任務 2.當任務增加的時候能夠動態的增加執行緒池中線程的數量值到達乙個閾值 3.當任務執行完畢的時候,能夠動態的銷毀執行緒池中的執行緒 4.該執行緒池的實現本質上也是生產者與消費者模型的應用。生產者執行緒向任務佇列新增任務,一旦佇列有任務到來,如果有等待 執行緒就喚醒來執行...