这段代码我试着抄下来理解了下,在测试过程当中出现不稳定的情况。

主要问题是最后的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 线程池(不稳定的方案)相关推荐

  1. **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)

    2019独角兽企业重金招聘Python工程师标准>>> 前面有一篇文章中,博主为大家介绍了**xxchat系统线程监控方案.今天博主为大家分享的是**微xxxx系统三大队列任务执行时 ...

  2. 如图两道面试题,顺便深入线程池,并连环17问

    这两面试题是基友朋友最近去面滴滴遇到的,今天就借着这两面试真题来深入一波线程池吧,这篇文章力求把线程池核心点和常问的面试点一网打尽,当然个人能力有限,可能会有遗漏,欢迎留言补充! 先把问题列出来,如果 ...

  3. 两个高频设计类面试题:如何设计HashMap和线程池

    你好,我是 yes. 最近在汇总面试题,但是我写的这个版本不是背诵版,不是那种死记硬背刻板的答案. 我的本意是抛砖引玉,针对每个题目给出我自己的理解和解释型的答案,然后背诵版本需要你们自行去总结和记忆 ...

  4. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  5. 每日一博 - Review线程池_02

    文章目录 Pre 使用场景 场景1:响应速度优先 场景2:吞吐量优先 线程池设置不合理发生的那些故障 线程池的参数如何评估和配置??? 不用线程池? 万能公式? 线程池参数动态化? 线程池的监控 Pr ...

  6. 线程池参数如何设置?

    前言 着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发 ...

  7. 线程池在美团的最佳实践

    随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...

  8. 【有料】Java线程池实现原理及其在美团业务中的实践

    随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...

  9. Java线程池实现原理及其在美团业务中的实践(转载加总结)

    我们知道线程有5种状态分别是新建,就绪,运行,阻塞,死亡,而对应的线程池也有5种状态RUNNING运行,线程池创建就是该状态,SHUTDOWN 不接受新任务,但是处理已存在的任务,STOP不接受新任务 ...

  10. 动态调整线程池参数实践

    欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.线程池遇到的挑战 我们上一篇 <一文读懂线程池的实现原 ...

最新文章

  1. 动态规划之划分数组形成两个和相等的子集
  2. 梯度下降算法到logistic回归
  3. Js基本函数 2017-03-20
  4. c语言可循环计算器代码,可编程简易计算器(代码)
  5. Comparable 与 Comparator
  6. System76 是如何打造开源硬件的
  7. JAVA基础【刘意】27天全集【Day02小结】
  8. PADS2007教程(一)——原理图封装
  9. 完美解决 报错原理 Unable to rename ‘XXXXXXXXX.jar‘ to xxxx
  10. Google Play上架总结(三)Google Play 上架流程
  11. DDD中的值对象和实体
  12. 项目生命周期、开发生命周期与产品生命周期的区别
  13. PowerPoint 2010去掉了宏录制器
  14. Leetcode1038. 把二叉搜索树转换为累加树
  15. 嵌入式软件开发学习 工程师要掌握的基本技能
  16. CBA第32轮:八一南昌男篮再胜北控 完成赛季“四连杀”
  17. ASP.Net MVC3 图片上传详解(form.js,bootstrap)
  18. c语言去除字符串的空格,C语言实现去除字符串中空格
  19. 深度学习错误汇总:Tensorboard给的网址打不开
  20. OLED屏幕详解-显示原理

热门文章

  1. 网络推广专员教你如何做好长尾关键词优化?
  2. 如何更科学的进行SEO优化?保持排名稳定
  3. 网站SEO优化工作主要包括哪些内容?
  4. python网络编程库_Python网络编程——协程
  5. h5MYSQL并进行增删查改_mysql增删改查
  6. 开发日记-20190527 关键词 ubuntu无线网卡驱动安装
  7. fixing macOS Sierra fatal error: 'openssl/opensslv.h' or 'openssl/aes.h' file not found
  8. android从放弃到精通 第一天 重拾项目开发
  9. elasticsearch如何安全重启
  10. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...