Linux平台下线程池的原理及实现
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
   下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。
   pool_init()函数预先创建好max_thread_num个线程,每个线程执thread_routine ()函数。该函数中
- while (pool->cur_queue_size == 0)
 - {
 -        pthread_cond_wait (&(pool->queue_ready),&(pool->queue_lock));
 - }
 
表示如果任务链表中没有任务,则该线程出于阻塞等待状态。否则从队列中取出任务并执行。
   
   pool_add_worker()函数向线程池的任务链表中加入一个任务,加入后通过调用pthread_cond_signal (&(pool->queue_ready))唤醒一个出于阻塞状态的线程(如果有的话)。
   
   pool_destroy ()函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。
下面贴出完整代码
- #include <stdio.h>
 - #include <stdlib.h>
 - #include <unistd.h>
 - #include <sys/types.h>
 - #include <pthread.h>
 - #include <assert.h>
 
- /*
 - *线程池里所有运行和等待的任务都是一个CThread_worker
 - *由于所有任务都在链表里,所以是一个链表结构
 - */
 - typedef struct worker
 - {
 -     
 -     void *(*process) (void *arg);
 -     void *arg;
 -     struct worker *next;
 
- } CThread_worker;
 
- /*线程池结构*/
 - typedef struct
 - {
 -      pthread_mutex_t queue_lock;
 -      pthread_cond_t queue_ready;
 
-     
                        
                     
 
                    
                    
                        免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。