Linux C 实现一个简单的线程池
https://www.cnblogs.com/GyForever1004/p/9185240.html
線程池的定義
線程池是一種多線程處理形式,處理過程中將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)的堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元中。如果某個(gè)線程在托管代碼中空閑(如正在等待某個(gè)事件),則線程池將插入另一個(gè)輔助線程來(lái)使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊(duì)列中包含掛起的工作,則線程池將在一段時(shí)間后創(chuàng)建另一個(gè)輔助線程但線程的數(shù)目永遠(yuǎn)不會(huì)超過最大值。超過最大值的線程可以排隊(duì),但他們要等到其他線程完成后才啟動(dòng)。
什么時(shí)候需要?jiǎng)?chuàng)建線程池呢?
簡(jiǎn)單的說(shuō),如果一個(gè)應(yīng)用需要頻繁的創(chuàng)建和銷毀線程,而任務(wù)執(zhí)行的時(shí)間又非常短,這樣線程創(chuàng)建和銷毀的帶來(lái)的開銷就不容忽視,這時(shí)也是線程池該出場(chǎng)的機(jī)會(huì)了。如果線程創(chuàng)建和銷毀時(shí)間相比任務(wù)執(zhí)行時(shí)間可以忽略不計(jì),則沒有必要使用線程池了。
實(shí)現(xiàn)程序(未完成相關(guān)資源的釋放操作)
/********************Pthread Pool14/06/18 22:06********************/#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pthread.h> #include <pthread.h>/* 任務(wù)節(jié)點(diǎn)結(jié)構(gòu) */ typedef struct node {void (*func)(void *arg);unsigned int *work_id;struct node *next; }TaskNode;/* 線程池結(jié)構(gòu) */ typedef struct {pthread_cond_t ready;pthread_mutex_t lock;struct node *task_head;pthread_t *thread_id;unsigned int cur_queue_size; }PthreadPool;static PthreadPool *pool = NULL;/* 定義線程 */ void *thread_routine (void *arg) {while(1){pthread_mutex_lock(&pool->lock);if(!pool->cur_queue_size){printf("Thread is waiting .... \n");pthread_cond_wait(&pool->ready, &pool->lock);}pool->cur_queue_size--;TaskNode *worker = pool->task_head;pool->task_head= worker->next;pthread_mutex_unlock (&(pool->lock));/* 調(diào)用函數(shù),執(zhí)行任務(wù) */worker->func(worker->work_id);free (worker);worker = NULL;} }static void system_init () {int i = 0;pool = (PthreadPool*) malloc(sizeof(PthreadPool));/* 初始化鎖與條件變量 */pthread_mutex_init (&pool->lock, NULL);pthread_cond_init (&pool->ready, NULL);/* 在池中加入 3 個(gè)線程 */pool->thread_id = (pthread_t*) malloc(3 * sizeof(PthreadPool));pool->cur_queue_size = 0;pool->task_head= NULL;for(; i<3; i++)pthread_create(&pool->thread_id[i], NULL, thread_routine, NULL); }/* 添加任務(wù) */ int pool_add_work (void (*process)(void *arg), unsigned int *id) {TaskNode *new_work = (TaskNode*) malloc(sizeof(TaskNode));new_work->func = process;new_work->work_id = id;new_work->next = NULL;pool->cur_queue_size++;TaskNode *temp = pool->task_head;if(!temp)pool->task_head = new_work;else{while(temp->next)temp = temp->next;temp->next = new_work;}pthread_cond_signal(&pool->ready); }/* 定義用戶任務(wù) */ void my_process(void *arg) {printf ("threadid is 0x%x, working on task %d \n", pthread_self(), *(int *)arg);sleep (1); }int main() {unsigned int work_id[10];int i = 0;system_init();/* 等待線程運(yùn)行 */sleep(1);for(; i<10; i++){work_id[i] = i;pool_add_work(my_process, &work_id[i]);}/* 等待任務(wù)執(zhí)行完畢 */sleep(5);return 0; }Linux 上編譯后,運(yùn)行結(jié)果:
參考自:blog.csdn.net/zouxinfox/article/details/3560891
你的支持就是我的動(dòng)力! 轉(zhuǎn)載請(qǐng)注明出處,謝謝!
總結(jié)
以上是生活随笔為你收集整理的Linux C 实现一个简单的线程池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷士兵证免费吗
- 下一篇: lol什么装备能让人变大