linux线程池
来源:互联网 发布:mac spss24 编辑:程序博客网 时间:2024/05/18 19:43
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <string.h> 5 #include <errno.h> 6 #include <time.h> 7 #include <pthread.h> 8 9 typedef struct condition 10 { 11 pthread_mutex_t pmutex; 12 pthread_cond_t pcond; 13 }condition_t; 14 15 typedef struct task 16 { 17 void *(*run)(void *arg); 18 void *arg; 19 struct task *next; 20 }task_t; 21 22 typedef struct threadpool 23 { 24 condition_t ready; 25 task_t *first; 26 task_t *last; 27 int counter; 28 int idle; 29 int max_threads; 30 int quit; 31 }threadpool_t; 32 33 34 int condition_init(condition_t *cond) 35 { 36 int status; 37 if((status = pthread_mutex_init(&cond->pmutex,NULL)))//返回0代表初始化成功 38 return status; 39 if((status = pthread_cond_init(&cond->pcond,NULL))) 40 return status; 41 return 0; 42 } 43 int condition_lock(condition_t *cond) 44 { 45 return pthread_mutex_lock(&cond -> pmutex); 46 } 47 int condition_unlock(condition_t *cond) 48 { 49 return pthread_mutex_unlock(&cond -> pmutex); 50 } 51 int condition_wait(condition_t *cond) 52 { 53 return pthread_cond_wait(&cond -> pcond,&cond -> pmutex); 54 } 55 int condition_timewait(condition_t *cond,const struct timespec *abstime) 56 { 57 return pthread_cond_timedwait(&cond->pcond,&cond->pmutex,abstime); 58 } 59 int condition_signal(condition_t *cond) 60 { 61 return pthread_cond_signal(&cond->pcond); 62 } 63 int condition_broadcast(condition_t *cond) 64 { 65 return pthread_cond_broadcast(&cond -> pcond); 66 } 67 int condition_destory(condition_t *cond) 68 { 69 int status; 70 if((status = pthread_mutex_destroy(&cond -> pmutex))) 71 return status; 72 if((status = pthread_cond_destroy(&cond -> pcond))) 73 return status; 74 return 0; 75 } 76 77 78 void *thread_routine(void *arg) 79 { 80 struct timespec abstime; 81 int timeout; 82 printf("thread 0x%0x is starting\n",(int)pthread_self()); 83 threadpool_t *pool = (threadpool_t *)arg; 84 while(1) 85 { 86 timeout = 0; 87 condition_lock(&pool -> ready); 88 pool -> idle++; 89 //等待队列有任务到来或者线程池销毁的通知 90 while(pool -> first == NULL && !pool -> quit) 91 { 92 printf("thread 0x%0x is waiting\n",(int)pthread_self()); 93 clock_gettime(CLOCK_REALTIME,&abstime); 94 abstime.tv_sec += 2; 95 int status=condition_timewait(&pool -> ready,&abstime); 96 if(status == ETIMEDOUT) 97 { 98 printf("thread 0x%0x is wait timed out\n",(int)pthread_self()); 99 timeout = 1;100 break;101 }102 103 }104 //等到到条件,处于工作状态105 pool -> idle--;106 107 if(pool -> first != NULL)108 {109 task_t *t = pool -> first;110 pool -> first = t -> next;111 //需要先解锁,以便添加新任务。其他消费者线程能够进入等待任务。112 condition_unlock(&pool -> ready);113 t -> run(t->arg);114 free(t);115 condition_lock(&pool -> ready);116 }117 //等待线程池销毁的通知118 if(pool -> quit && pool ->first == NULL)119 {120 pool -> counter--;121 if(pool->counter == 0)122 {123 condition_signal(&pool -> ready);124 }125 condition_unlock(&pool->ready);126 //跳出循环之前要记得解锁127 break;128 }129 130 if(timeout &&pool -> first ==NULL)131 {132 pool -> counter--;133 condition_unlock(&pool->ready);134 //跳出循环之前要记得解锁135 break;136 }137 condition_unlock(&pool -> ready);138 }139 140 printf("thread 0x%0x is exiting\n",(int)pthread_self());141 return NULL;142 }143 144 //初始化145 void threadpool_init(threadpool_t *pool, int threads)146 {147 condition_init(&pool -> ready);148 pool -> first = NULL;149 pool -> last = NULL;150 pool -> counter = 0;151 pool -> idle = 0;152 pool -> max_threads = threads;153 pool -> quit = 0;154 }155 156 //加任务157 void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg),void *arg)158 {159 task_t *newstask = (task_t *)malloc(sizeof(task_t));160 newstask->run = run;161 newstask->arg = arg;162 newstask -> next = NULL;163 164 condition_lock(&pool -> ready);165 //将任务添加到对列中166 if(pool -> first ==NULL)167 {168 pool -> first = newstask;169 }170 else171 pool -> last -> next = newstask;172 pool -> last = newstask;173 //如果有等待线程,则唤醒其中一个174 if(pool -> idle > 0)175 {176 condition_signal(&pool -> ready);177 }178 else if(pool -> counter < pool -> max_threads)179 {180 pthread_t tid;181 pthread_create(&tid,NULL,thread_routine,pool);182 pool -> counter++;183 }184 condition_unlock(&pool -> ready);185 }186 //销毁线程池187 void threadpool_destory(threadpool_t *pool)188 {189 190 if(pool -> quit)191 {192 return;193 }194 condition_lock(&pool -> ready);195 pool->quit = 1;196 if(pool -> counter > 0)197 {198 if(pool -> idle > 0)199 condition_broadcast(&pool->ready);200 201 while(pool -> counter > 0)202 {203 condition_wait(&pool->ready);204 }205 }206 condition_unlock(&pool->ready);207 condition_destory(&pool -> ready);208 }209 210 211 void *mytask(void *arg)212 {213 printf("thread 0x%0x is working on task %d\n",(int)pthread_self(),*(int*)arg);214 sleep(1);215 free(arg);216 return NULL;217 }218 int main()219 {220 threadpool_t pool;221 threadpool_init(&pool,3);222 223 int i ;224 for(i = 0; i < 10; i++)225 {226 int *arg = (int *)malloc(sizeof(int));227 *arg = i;228 threadpool_add_task(&pool,mytask,arg);229 }230 231 sleep(15);//为了等待其他线程结束 当然也可以通过pthread_join来做232 threadpool_destory(&pool);233 return 0;234 }
阅读全文
0 0
- linux下线程池
- linux 线程池实现
- Linux线程池
- Linux线程池
- Linux下线程池
- linux线程池
- Linux C++线程池
- linux 线程池
- linux线程池epoll
- Linux C++线程池
- linux 下线程池
- Linux线程池
- Linux线程池
- Linux线程池
- Linux C++线程池
- linux中的线程池
- Linux中的线程池
- Linux线程池
- pom.xml
- jq监听下拉列表至改变事件
- Linux 相关
- Excel合并工作表的神器—Power Query
- 面向对象--构造函数
- linux线程池
- iOS获取设备型号和App版本号等信息(OC+Swift3.0)
- Memcached expire 设置错误引起的set(key,exp,value)为true而get(key)为null的问题
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
- sql 查询按照分组将多条记录转换成单条记录的group_contact()函数
- ffmpeg中的x264编码选项,对应关系
- Unity Shader学习笔记:入门简述
- EasyUI使用代码
- POJ 2774Long Long Message(后缀数组入门题)