Linux C 实现一个简单的线程池
生活随笔
收集整理的這篇文章主要介紹了
Linux C 实现一个简单的线程池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.cnblogs.com/GyForever1004/p/9185240.html
線程池的定義
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。
什么時候需要創建線程池呢?
簡單的說,如果一個應用需要頻繁的創建和銷毀線程,而任務執行的時間又非常短,這樣線程創建和銷毀的帶來的開銷就不容忽視,這時也是線程池該出場的機會了。如果線程創建和銷毀時間相比任務執行時間可以忽略不計,則沒有必要使用線程池了。
實現程序(未完成相關資源的釋放操作)
/********************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>/* 任務節點結構 */ typedef struct node {void (*func)(void *arg);unsigned int *work_id;struct node *next; }TaskNode;/* 線程池結構 */ 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));/* 調用函數,執行任務 */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 個線程 */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); }/* 添加任務 */ 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); }/* 定義用戶任務 */ 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();/* 等待線程運行 */sleep(1);for(; i<10; i++){work_id[i] = i;pool_add_work(my_process, &work_id[i]);}/* 等待任務執行完畢 */sleep(5);return 0; }Linux 上編譯后,運行結果:
參考自:blog.csdn.net/zouxinfox/article/details/3560891
你的支持就是我的動力! 轉載請注明出處,謝謝!
總結
以上是生活随笔為你收集整理的Linux C 实现一个简单的线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷士兵证免费吗
- 下一篇: 实现Linux select IO复用C