linux下C语言实现一个线程池

linux下C语言实现一个线程池

ID:39465441

大小:92.50 KB

页数:7页

时间:2019-07-04

linux下C语言实现一个线程池_第1页
linux下C语言实现一个线程池_第2页
linux下C语言实现一个线程池_第3页
linux下C语言实现一个线程池_第4页
linux下C语言实现一个线程池_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。