欢迎来到天天文库
浏览记录
ID:39465441
大小:92.50 KB
页数:7页
时间:2019-07-04
《linux下C语言实现一个线程池》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、linux下C语言实现一个线程池(2012-04-1415:20:20)转载▼1什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。pool_init()函数预先创建好max_thread_num个线程,每个线程执
2、thread_routine()函数。该函数中while(pool->cur_queue_size==0)2{3pthread_cond_wait(&(pool->queue_ready),&(pool->queue_lock));4}5表示如果任务链表中没有任务,则该线程出于阻塞等待状态。否则从队列中取出任务并执行。pool_add_worker()函数向线程池的任务链表中加入一个任务,加入后通过调用pthread_cond_signal(&(pool->queue_ready))唤醒一个出于阻塞状态的线程(如果有的话)。poo
3、l_destroy()函数用于销毁线程池,线程池任务链表中的任务不会再被执行,但是正在运行的线程会一直把任务运行完后再退出。下面贴出完整代码#include1#include2#include3#include4#include5#include67typedefstructworker8{910void*(*process)(void*arg);11void*arg;12structworker*next
4、;1314}CThread_worker;151617typedefstruct18{19pthread_mutex_tqueue_lock;20pthread_cond_tqueue_ready;212223CThread_worker*queue_head;242526intshutdown;27pthread_t*threadid;2829intmax_thread_num;3031intcur_queue_size;3233}CThread_pool;343536intpool_add_worker(void*(*proc
5、ess)(void*arg),void*arg);37void*thread_routine(void*arg);38391staticCThread_pool*pool=NULL;2void3pool_init(intmax_thread_num)4{5pool=(CThread_pool*)malloc(sizeof(CThread_pool));67pthread_mutex_init(&(pool->queue_lock),NULL);8pthread_cond_init(&(pool->queue_ready),NULL
6、);910pool->queue_head=NULL;1112pool->max_thread_num=max_thread_num;13pool->cur_queue_size=0;1415pool->shutdown=0;1617pool->threadid=18(pthread_t*)malloc(max_thread_num*sizeof(pthread_t));19inti=0;20for(i=0;ithreadid[i]),
7、NULL,thread_routine,23NULL);24}25}262728int29pool_add_worker(void*(*process)(void*arg),void*arg)30{3132CThread_worker*newworker=33(CThread_worker*)malloc(sizeof(CThread_worker));34newworker->process=process;35newworker->arg=arg;36newworker->next=NULL;3738pthread_mutex
8、_lock(&(pool->queue_lock));3940CThread_worker*member=pool->queue_head;41if(member!=NULL)42{1while(member->next!=NULL)2member
此文档下载收益归作者所有