C 线程池(不稳定的方案)
这段代码我试着抄下来理解了下,在测试过程当中出现不稳定的情况。
主要问题是最后的sleep,它是等待任务结束然后结束,而不是收割结束。
还要再改改。
#include<stdlib.h> #include<stdio.h> #include<pthread.h>/** 存储线程任务的结构**/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;CThread_worker *queue_head;int shutdown;pthread_t *threadid;int max_thread_num;int cur_queue_size; } CThread_pool;int pool_add_worker(void *(*process) (void *arg),void *arg); void *thread_routine(void *arg);static CThread_pool *pool=NULL;void pool_init(int max_thread_num){pool=(CThread_pool *) malloc (sizeof (CThread_pool));pthread_mutex_init (&(pool->queue_lock),NULL);pthread_cond_init (&(pool->queue_ready),NULL);pool->queue_head=NULL;pool->max_thread_num=max_thread_num;pool->cur_queue_size=0;pool->shutdown=0;pool->threadid=(pthread_t *) malloc (max_thread_num * sizeof (pthread_t));int i=0;for (i=0;i<max_thread_num;i++){pthread_create(&(pool->threadid[i]),NULL,thread_routine,NULL);} }int pool_add_worker(void *(*process) (void *arg),void *arg) {CThread_worker *newworker=(CThread_worker *)malloc(sizeof (CThread_worker));newworker->process=process;newworker->arg=arg;newworker->next=NULL;pthread_mutex_lock (&(pool->queue_lock));CThread_worker *member=pool->queue_head;if(member !=NULL){while(member->next !=NULL)member=member->next;member->next=newworker;}else{pool->queue_head=newworker;}pool->cur_queue_size++;pthread_mutex_unlock (&(pool->queue_lock));pthread_cond_signal (&(pool->queue_ready));return 0; }int pool_destroy() {if(pool->shutdown)return -1;pool->shutdown=1;pthread_cond_broadcast (&(pool->queue_ready));int i;for(i=0;i<pool->max_thread_num;i++)pthread_join (pool->threadid[i],NULL);free(pool->threadid);CThread_worker *head=NULL;while(pool->queue_head !=NULL){head=pool->queue_head;pool->queue_head=pool->queue_head->next;free(head);}pthread_mutex_destroy(&(pool->queue_lock));pthread_cond_destroy(&(pool->queue_ready));free(pool);pool=NULL;return 0; }void * thread_routine(void *arg) {while(1){pthread_mutex_lock (&(pool->queue_lock));while(pool->cur_queue_size==0 && !pool->shutdown){pthread_cond_wait(&(pool->queue_ready),&(pool->queue_lock));}if(pool->shutdown){pthread_mutex_unlock (&(pool->queue_lock));pthread_exit(NULL);}pool->cur_queue_size--;CThread_worker *worker=pool->queue_head;pool->queue_head=worker->next;pthread_mutex_unlock(&(pool->queue_lock));(*(worker->process)) (worker->arg);free(worker);worker=NULL;}pthread_exit(NULL); }void * myprocess(void *arg) {printf("hello! %d\n",*(int *) arg);sleep(1);return NULL; }int main(int argc,char **argv) {pool_init(10);int *workingnum=(int *) malloc (sizeof (int) * 200);int i;for (i=0;i<100;i++){workingnum[i]=i;pool_add_worker(myprocess,&workingnum[i]);}sleep(20);pool_destroy();free(workingnum);return 0; }
转载于:https://www.cnblogs.com/xiaoCon/p/3668584.html
C 线程池(不稳定的方案)相关推荐
- **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)
2019独角兽企业重金招聘Python工程师标准>>> 前面有一篇文章中,博主为大家介绍了**xxchat系统线程监控方案.今天博主为大家分享的是**微xxxx系统三大队列任务执行时 ...
- 如图两道面试题,顺便深入线程池,并连环17问
这两面试题是基友朋友最近去面滴滴遇到的,今天就借着这两面试真题来深入一波线程池吧,这篇文章力求把线程池核心点和常问的面试点一网打尽,当然个人能力有限,可能会有遗漏,欢迎留言补充! 先把问题列出来,如果 ...
- 两个高频设计类面试题:如何设计HashMap和线程池
你好,我是 yes. 最近在汇总面试题,但是我写的这个版本不是背诵版,不是那种死记硬背刻板的答案. 我的本意是抛砖引玉,针对每个题目给出我自己的理解和解释型的答案,然后背诵版本需要你们自行去总结和记忆 ...
- Java线程池实现原理及其在美团业务中的实践
来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...
- 每日一博 - Review线程池_02
文章目录 Pre 使用场景 场景1:响应速度优先 场景2:吞吐量优先 线程池设置不合理发生的那些故障 线程池的参数如何评估和配置??? 不用线程池? 万能公式? 线程池参数动态化? 线程池的监控 Pr ...
- 线程池参数如何设置?
前言 着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发 ...
- 线程池在美团的最佳实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...
- 【有料】Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...
- Java线程池实现原理及其在美团业务中的实践(转载加总结)
我们知道线程有5种状态分别是新建,就绪,运行,阻塞,死亡,而对应的线程池也有5种状态RUNNING运行,线程池创建就是该状态,SHUTDOWN 不接受新任务,但是处理已存在的任务,STOP不接受新任务 ...
- 动态调整线程池参数实践
欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.线程池遇到的挑战 我们上一篇 <一文读懂线程池的实现原 ...
最新文章
- 动态规划之划分数组形成两个和相等的子集
- 梯度下降算法到logistic回归
- Js基本函数 2017-03-20
- c语言可循环计算器代码,可编程简易计算器(代码)
- Comparable 与 Comparator
- System76 是如何打造开源硬件的
- JAVA基础【刘意】27天全集【Day02小结】
- PADS2007教程(一)——原理图封装
- 完美解决 报错原理 Unable to rename ‘XXXXXXXXX.jar‘ to xxxx
- Google Play上架总结(三)Google Play 上架流程
- DDD中的值对象和实体
- 项目生命周期、开发生命周期与产品生命周期的区别
- PowerPoint 2010去掉了宏录制器
- Leetcode1038. 把二叉搜索树转换为累加树
- 嵌入式软件开发学习 工程师要掌握的基本技能
- CBA第32轮:八一南昌男篮再胜北控 完成赛季“四连杀”
- ASP.Net MVC3 图片上传详解(form.js,bootstrap)
- c语言去除字符串的空格,C语言实现去除字符串中空格
- 深度学习错误汇总:Tensorboard给的网址打不开
- OLED屏幕详解-显示原理
热门文章
- 网络推广专员教你如何做好长尾关键词优化?
- 如何更科学的进行SEO优化?保持排名稳定
- 网站SEO优化工作主要包括哪些内容?
- python网络编程库_Python网络编程——协程
- h5MYSQL并进行增删查改_mysql增删改查
- 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
- fixing macOS Sierra fatal error: 'openssl/opensslv.h' or 'openssl/aes.h' file not found
- android从放弃到精通 第一天 重拾项目开发
- elasticsearch如何安全重启
- 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...