記錄一下學習執行緒池的過程,**用到的函式歸結:
pthread_mutex_lock
pthread_mutex_unlock
pthread_cond_wait
pthread_cond_signal
pthread_cond_broadcast
pthread_create
pthread_join
程式中還用到了鍊錶,
還有乙個知識點:任何型別的資料都可以是void型別,
但void型別在使用之前必須進行強制型別轉換。
/*
*author:greens_ren
*description:執行緒池
*//*標頭檔案*/
#include#include/* begin : add */
#include#include#include#include/* end : add */
/*資料結構*/
typedef struct thread_worker
cthread_worker;
typedef struct thread_pool
cthread_pool;
/*全域性區*/
static cthread_pool *pool = null;
/*函式*/
void pthread_init(int max_thread_num);
void *thread_roution(void * arg);
void pthread_add_worker(void *(*worker)(void *arg), void * arg);
void pthread_destroy(void);
void* my_process(void *arg);
/*main*/
int main(void)
/*等待處理任務*/
sleep(8);
pthread_destroy();
return 0;
}void pthread_init(int max_thread_num)
/*初始化任務等待佇列*/
pool->cur_queue_size = 0;
//pool->phead = (cthread_worker *)malloc(sizeof(cthread_worker));
//pool->phead->next = null;
/*罪過,這裡考慮多了。在pool中就是存了乙個指標,只不過它是指定了乙個鍊錶*/
pool->phead = null;
/*執行緒池銷毀標記*/
pool->shutdown = 0;
return;
}void *thread_roution(void * arg)
/*如果執行緒池已被標記銷毀,那就退出執行緒*/
if(pool->shutdown == 1)
printf("thread 0x%x is starting to work\n", pthread_self());
/*assert是除錯用的好助手,assert如果為家,它就會通過stderr列印錯誤資訊,並終止程式*/
assert(pool->cur_queue_size != 0);
assert(pool->shutdown != 1);
/*開始處理等待佇列中的任務*/
/***函式*/
pool->cur_queue_size--;
cthread_worker * worker_waiting = pool->phead;
pool->phead = worker_waiting->next;
/*這裡加鎖的目的就是為了處理任務鍊錶,處理完後就 可以解鎖,讓其它執行緒再次去處理任務鍊錶*/
pthread_mutex_unlock(&(pool->queue_lock)); /*modified by 開始的時候講解鎖放在了**函式後面,這裡做修正*/
/*呼叫**函式,執行任務*/
(*(worker_waiting->worker))(worker_waiting->arg);
/*刪除鍊錶中已經執行過的任務節點*/
free(worker_waiting);
worker_waiting = null;
}}void pthread_add_worker(void *(*worker)(void *arg), void * arg)
phead_worker->next = worker_insert; /*這裡將新構建的任務節點新增到了等待任務鍊錶的結尾*/
}else
assert(pool->phead != null);/*這裡檢查一下等待鍊錶不為空*/
pool->cur_queue_size++; /*同步修改等待佇列的長度資訊*/
pthread_mutex_unlock(&(pool->queue_lock));
/*等待佇列中新增了新任務,這裡就要喚醒執行緒去處理,如果無線程睡眠,這條語句就無效*/
pthread_cond_signal(&(pool->queue_ready));
return;
}void pthread_destroy(void)
/*這裡先將銷毀執行緒池標記置位*/
pool->shutdown = 1;
/*喚醒所以等待執行緒,執行緒池要銷毀了*/
pthread_cond_broadcast(&(pool->queue_ready));
/*阻塞等待執行緒執行緒退出,否則就成了殭屍了*/
int i;
for (i = 0; i < pool->max_thread_num; i ++)
/*釋放執行緒號儲存占用資源*/
free(pool->phead_threadid);
pool->phead_threadid = null;
/*釋放任務等待佇列*/
cthread_worker *pworker_del = null;
while(pool->phead != null)
/*銷毀條件變數和互斥鎖,剛開始也忘記了*/
pthread_mutex_destroy(&(pool->queue_lock));
pthread_cond_destroy(&(pool->queue_ready));
/*釋放執行緒池*/
free(pool);
pool = null;
return;
}void *my_process(void * arg)
Python 學習筆記 執行緒池
前面我們學校裡如何建立多執行緒,當我們接到乙個新的請求時,會建立乙個執行緒,執行完畢之後又銷毀掉這個執行緒。對於一些數目巨大,但是單個快速執行的任務,每個任務真正執行消耗的時間和執行緒建立銷毀的時間可能都差不多。這樣一來,執行緒的效率浪費的比較嚴重。因此可以考慮使用執行緒池的技術,預先建立一些空閒的...
java學習筆記 執行緒池
1.為什麼有執行緒池?既然是乙個存放執行緒的池子,那麼,執行緒池的工作要務肯定就是控制管理執行的執行緒啦。既然要 原理,我們肯定得從原始碼說起了。我們先來介紹一下四個常見的執行緒池 四個基本執行緒池 建立單個執行緒 executors.newsinglethreadexecutor public s...
jdk執行緒池學習筆記
1.執行緒池的執行緒儲存在hashset中,處理流程 core pool blocking queue max pool reject policy 2.核心執行緒池一般不會 除非設定了allowcorethreadtimeout,執行緒空閒時處於駐留狀態 locksupport.park 3.ke...