ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:18.21KB ,
资源ID:30175307      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30175307.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(线程池的概念运用与完整代码示例.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

线程池的概念运用与完整代码示例.docx

1、线程池的概念运用与完整代码示例线程池的概念与完整代码示例最近在网上学习了线程池的概念和使用方法,因此想趁着自己空闲的时候,拿出来给大家分享一下。文章如有不当之处,还望多多指正,个人邮箱:helpyleeThanks. 线程池引入的必要性:在网络服务器中,包括大量的web服务器,它们都需要在单位时间内必须处理相当数目的接入请求以及数据处理。通常在传统多线程服务器中是这样实现的:一旦有个请求到达,就创建一个线程,由该线程执行任务,任务执行完毕后,线程就退出。这也就是通常所说的及时创建,及时销毁策略。在现代计算机中,尽管创建线程的时间已经大大缩短,但是如果提交给线程的任务是执行时间较短,而且次数非常

2、的频繁,那么服务器就将处于一个不停创建于销毁线程的状态下,这将是一笔不小的开销。尤其是在线程执行的时间非常短的情况。线程池就是为了解决上述问题的,它的实现原理是这样的:在应用程序启动之后,就马上创建一定数量的线程,放入空闲的队列中。这些线程都是处于阻塞状态,这些线程只占一点内存,不占用CPU。当任务到来后,线程池将选择一个空闲的线程,将任务传入此线程中运行。当所有的线程都处在处理任务的时候,线程池将自动创建一定的数量的新线程,用于处理更多的任务。执行任务完成之后线程并不退出,而是继续在线程池中等待下一次任务。当大部分线程处于阻塞状态时,线程池将自动销毁一部分的线程,回收系统资源。 线程池概念

3、下面是一个简单线程池的实现,这个线程池的代码是我从网上的一个例子参考到的,程序的整体方案是这样的:程序启动之前,初始化线程池,启动线程池中的线程,由于还没有任务到来,线程池中的所有线程都处在阻塞状态,当一有任务到达就从线程池中取出一个空闲线程处理,如果所有的线程都处于工作状态,就添加到队列,进行排队。如果队列中的任务个数大于队列的所能容纳的最大数量,那就不能添加任务到队列中,只能等待队列不满才能添加任务到队列中。本程序由三个文件组成,分别是threadpoll.h,threadpoll.c,main.c,下面的代码已经在64位系统成功运行。验证环境:Distributor ID: Ubuntu

4、Description: Ubuntu 13.04Release: 13.04Codename: raring 线程池代码示例threadpoll.h文件下的代码#ifndef _THREADPOLL_H_#define _THREADPOLL_H_#include#include#include#includestruct job void* (*callback_function)(void *arg); /线程回调函数 void *arg; /回调函数参数 struct job *next;struct threadpool int thread_num; /线程池中开启线程的个数 in

5、t queue_max_num; /队列中最大job的个数 struct job *head; /指向job的头指针 struct job *tail; /指向job的尾指针 pthread_t *pthreads; /线程池中所有线程的pthread_t pthread_mutex_t mutex; /互斥信号量 pthread_cond_t queue_empty; /队列为空的条件变量 pthread_cond_t queue_not_empty; /队列不为空的条件变量 pthread_cond_t queue_not_full; /队列不为满的条件变量 int queue_cur_n

6、um; /队列当前的job个数 int queue_close; /队列是否已经关闭 int pool_close; /线程池是否已经关闭;/=/函数名: threadpool_init/函数描述: 初始化线程池/输入: in thread_num 线程池开启的线程个数/ in queue_max_num 队列的最大job个数 /输出: 无/返回: 成功:线程池地址 失败:NULL/=struct threadpool* threadpool_init(int thread_num, int queue_max_num);/=/函数名: threadpool_add_job/函数描述: 向线程

7、池中添加任务/输入: in pool 线程池地址/ in callback_function 回调函数/ in arg 回调函数参数/输出: 无/返回: 成功:0 失败:-1/=int threadpool_add_job(struct threadpool *pool, void* (*callback_function)(void *arg), void *arg);/=/函数名: threadpool_destroy/函数描述: 销毁线程池/输入: in pool 线程池地址/输出: 无/返回: 成功:0 失败:-1/=int threadpool_destroy(struct thre

8、adpool *pool);/=/函数名: threadpool_function/函数描述: 线程池中线程函数/输入: in arg 线程池地址/输出: 无 /返回: 无/=void* threadpool_function(void* arg);#endifthreadpoll.c#include threadpoll.h#includestruct threadpool* threadpool_init(int thread_num, int queue_max_num) struct threadpool *pool = NULL; do pool = malloc(sizeof(st

9、ruct threadpool); if (NULL = pool) printf(failed to malloc threadpool!n); break; pool-thread_num = thread_num; pool-queue_max_num = queue_max_num; pool-queue_cur_num = 0; pool-head = NULL; pool-tail = NULL; if (pthread_mutex_init(&(pool-mutex), NULL) printf(failed to init mutex!n); break; if (pthrea

10、d_cond_init(&(pool-queue_empty), NULL) printf(failed to init queue_empty!n); break; if (pthread_cond_init(&(pool-queue_not_empty), NULL) printf(failed to init queue_not_empty!n); break; if (pthread_cond_init(&(pool-queue_not_full), NULL) printf(failed to init queue_not_full!n); break; pool-pthreads

11、= malloc(sizeof(pthread_t) * thread_num); if (NULL = pool-pthreads) printf(failed to malloc pthreads!n); break; pool-queue_close = 0; pool-pool_close = 0; int i; for (i = 0; i thread_num; +i) pthread_create(&(pool-pthreadsi), NULL, threadpool_function, (void *)pool); return pool; while (0); return N

12、ULL;int threadpool_add_job(struct threadpool* pool, void* (*callback_function)(void *arg), void *arg) assert(pool != NULL); assert(callback_function != NULL); assert(arg != NULL); pthread_mutex_lock(&(pool-mutex); while (pool-queue_cur_num = pool-queue_max_num) & !(pool-queue_close | pool-pool_close

13、) pthread_cond_wait(&(pool-queue_not_full), &(pool-mutex); /队列满的时候就等待 if (pool-queue_close | pool-pool_close) /队列关闭或者线程池关闭就退出 pthread_mutex_unlock(&(pool-mutex); return -1; struct job *pjob =(struct job*) malloc(sizeof(struct job); if (NULL = pjob) pthread_mutex_unlock(&(pool-mutex); return -1; pjob

14、-callback_function = callback_function; pjob-arg = arg; pjob-next = NULL; if (pool-head = NULL) pool-head = pool-tail = pjob; pthread_cond_broadcast(&(pool-queue_not_empty); /队列空的时候,有任务来时就通知线程池中的线程:队列非空 else pool-tail-next = pjob; pool-tail = pjob; pool-queue_cur_num+; pthread_mutex_unlock(&(pool-mu

15、tex); return 0;void* threadpool_function(void* arg) struct threadpool *pool = (struct threadpool*)arg; struct job *pjob = NULL; while (1) /死循环 pthread_mutex_lock(&(pool-mutex); while (pool-queue_cur_num = 0) & !pool-pool_close) /队列为空时,就等待队列非空 pthread_cond_wait(&(pool-queue_not_empty), &(pool-mutex);

16、 if (pool-pool_close) /线程池关闭,线程就退出 pthread_mutex_unlock(&(pool-mutex); pthread_exit(NULL); pool-queue_cur_num-; pjob = pool-head; if (pool-queue_cur_num = 0) pool-head = pool-tail = NULL; else pool-head = pjob-next; if (pool-queue_cur_num = 0) pthread_cond_signal(&(pool-queue_empty); /队列为空,就可以通知thre

17、adpool_destroy函数,销毁线程函数 if (pool-queue_cur_num = pool-queue_max_num - 1) pthread_cond_broadcast(&(pool-queue_not_full); /队列非满,就可以通知threadpool_add_job函数,添加新任务 pthread_mutex_unlock(&(pool-mutex); (*(pjob-callback_function)(pjob-arg); /线程真正要做的工作,回调函数的调用 free(pjob); pjob = NULL; int threadpool_destroy(s

18、truct threadpool *pool) assert(pool != NULL); pthread_mutex_lock(&(pool-mutex); if (pool-queue_close | pool-pool_close) /线程池已经退出了,就直接返回 pthread_mutex_unlock(&(pool-mutex); return -1; pool-queue_close = 1; /置队列关闭标志 while (pool-queue_cur_num != 0) pthread_cond_wait(&(pool-queue_empty), &(pool-mutex);

19、/等待队列为空 pool-pool_close = 1; /置线程池关闭标志 pthread_mutex_unlock(&(pool-mutex); pthread_cond_broadcast(&(pool-queue_not_empty); /唤醒线程池中正在阻塞的线程 pthread_cond_broadcast(&(pool-queue_not_full); /唤醒添加任务的threadpool_add_job函数 int i; for (i = 0; i thread_num; +i) pthread_join(pool-pthreadsi, NULL); /等待线程池的所有线程执行

20、完毕 pthread_mutex_destroy(&(pool-mutex); /清理资源 pthread_cond_destroy(&(pool-queue_empty); pthread_cond_destroy(&(pool-queue_not_empty); pthread_cond_destroy(&(pool-queue_not_full); free(pool-pthreads); struct job *p;while (pool-head != NULL) p = pool-head; pool-head = p-next; free(p); free(pool); retu

21、rn 0; main.c#include#includethreadpoll.hvoid* work(void* arg) char *p = (char*) arg; printf(threadpool callback fuction : %s.n, p); sleep(1);int main(void) struct threadpool *pool = threadpool_init(10, 20); threadpool_add_job(pool, work, 1); threadpool_add_job(pool, work, 2); threadpool_add_job(pool

22、, work, 3); threadpool_add_job(pool, work, 4); threadpool_add_job(pool, work, 5); threadpool_add_job(pool, work, 6); threadpool_add_job(pool, work, 7); threadpool_add_job(pool, work, 8); threadpool_add_job(pool, work, 9); threadpool_add_job(pool, work, 10); threadpool_add_job(pool, work, 11); thread

23、pool_add_job(pool, work, 12); threadpool_add_job(pool, work, 13); threadpool_add_job(pool, work, 14); threadpool_add_job(pool, work, 15); threadpool_add_job(pool, work, 16); threadpool_add_job(pool, work, 17); threadpool_add_job(pool, work, 18); threadpool_add_job(pool, work, 19); threadpool_add_job

24、(pool, work, 20); threadpool_add_job(pool, work, 21); threadpool_add_job(pool, work, 22); threadpool_add_job(pool, work, 23); threadpool_add_job(pool, work, 24); threadpool_add_job(pool, work, 25); threadpool_add_job(pool, work, 26); threadpool_add_job(pool, work, 27); threadpool_add_job(pool, work,

25、 28); threadpool_add_job(pool, work, 29); threadpool_add_job(pool, work, 30); threadpool_add_job(pool, work, 31); threadpool_add_job(pool, work, 32); threadpool_add_job(pool, work, 33); threadpool_add_job(pool, work, 34); threadpool_add_job(pool, work, 35); threadpool_add_job(pool, work, 36); thread

26、pool_add_job(pool, work, 37); threadpool_add_job(pool, work, 38); threadpool_add_job(pool, work, 39); threadpool_add_job(pool, work, 40); sleep(5); threadpool_destroy(pool); return 0; 运行结果 gcc main.c threadpoll.c -lpthread -othreadpoll ./threadpoll执行结果如下:kyky-S910-X31E:/libz/623$ ./threadpollthreadp

27、ool callback fuction : 1.threadpool callback fuction : 2.threadpool callback fuction : 8.threadpool callback fuction : 5.threadpool callback fuction : 3.threadpool callback fuction : 13.threadpool callback fuction : 6.threadpool callback fuction : 17.threadpool callback fuction : 18.threadpool callback fuction : 19.threadpool callback fuction : 20.threadpool callback fuction : 21.threadpool callback fuction : 22.threadpool callback fuction : 23.threadpool callback fuction :

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1