一、设计线程池的优点、作用

  • 在前面的文章(https://dongshao.blog.csdn.net/article/details/99708377)中我们设计过了一种线程池,但是那种线程池比较复杂代码比较多,本文介绍一个简略版的线程池
  • 线程使应用能够更加充分合理的协调利用cpu 、内存、网络、i/o等系统资源。
  • 线程的创建需要开辟虚拟机栈,本地方法栈、程序计数器等线程私有的内存空间。
  • 在线程的销毁时需要回收这些系统资源。频繁的创建和销毁线程会浪费大量的系统资源,增加并发编程的风险。
  • 另外,在服务器负载过大的时候,如何让新的线程等待或者友好的拒绝服务?这些丢失线程自身无法解决的。所以需要通过线程池协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务。

二、线程池的设计

  • 本线程池比较简单,就包括3个内容:

    • 任务节点。
    • 线程节点。
    • 线程池。
  • 任务节点:
    • 功能:就是一个任务,其有一个回调函数,用于执行任务。
    • 特点:当有新任务加入线程池之后,这个任务会被线程池分配给线程去处理。
//任务节点
typedef struct NJOB
{void (*_jobFunc)(void *NJOB); //回调函数void *_userData;              //回调函数参数struct NJOB *_next;struct NJOB *_prev;
}NJOB;
  • 线程节点:

    • 功能:单个线程的表示结构体,可以用来处理任务,
    • 特点:线程各自运行在自己的pthread_create()回调函数中,一直不间断的执行任务,
//线程节点
typedef struct NWORKER
{pthread_t _tid;                //线程节点的tidstruct NWORKQUEUE *_workQueue; //该线程所属的线程池int _terminate;      //是否终止工作struct NWORKER *_next;struct NWORKER *_prev;
}NWORKER;
  • 线程池:线程池对象,保存着任务和所有的线程。
//线程池(管理着所有的任务和线程节点)
typedef struct NWORKQUEUE
{struct NJOB    *_jobs;struct NWORKER *_workers;int _sumWorkersNum;  //总共的线程数int _freeWorkersNum; //空闲的线程数pthread_mutex_t _mutex; //互斥锁pthread_cond_t  _cond;  //条件变量
}NWORKQUEUE;typedef NWORKQUEUE threadPool;

三、编程实现

  • 源码下载方式:

    • CSDN下载:https://download.csdn.net/download/qq_41453285/13740168。
    • 或者公众号【多栖技术控小董】回复【13740168】获取下载链接。

运行

  • 下载代码,进入目录之后输入make编译,然后运行即可

Linux(程序设计):66---简略版的线程池设计相关推荐

  1. Linux程序设计(第4版)

    查看书籍详细信息: Linux程序设计(第4版) 编辑推荐 最负盛名的Linux程序设计图书 内容全面深入 全球开源社区集体智慧结晶 内容简介 本书讲述了Linux系统及其他UNIX风格的操作系统上的 ...

  2. linux网络编程(四)线程池

    linux网络编程(四)线程池 为什么会有线程池? 实现简单的线程池 为什么会有线程池? 大多数的服务器可能都有这样一种情况,就是会在单位时间内接收到大量客户端请求,我们可以采取接受到客户端请求创建一 ...

  3. 线程池设计中的惊群问题

    2019独角兽企业重金招聘Python工程师标准>>> 多线程编程已经是现在网络编程中常用的编程技术,设计一个良好的线程池库显得尤为重要.在 UNIX(WIN32下可以采用类似的方法 ...

  4. linux下boost的一个扩展线程池-threadpool-的学习

    转自:http://www.cnblogs.com/xiaouisme/archive/2012/10/04/2711691.html 安装boost: http://www.boost.org/下载 ...

  5. linux 使用jstack_案例解析:线程池使用不当导致的系统崩溃

    前几天,发现一台阿里云服务器上的Web服务不可用.远程SSH登录不上,尝试几次登录上去之后,执行命令都显示 -bash: fork: Cannot allocate memory 一看以为是内存泄漏导 ...

  6. Linux C 实现一个简单的线程池

    https://www.cnblogs.com/GyForever1004/p/9185240.html 线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动 ...

  7. linux下C语言简单实现线程池

    0 前言 网上关于线程池的例子还是不少,简单明了的倒是比较少,看了网上的资料,打算借鉴网上的一些例子,自己实现以下. 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程 ...

  8. 【Linux】生产者消费者编程实现-线程池+信号量

    生产者消费者编程实现,采用了线程池以及信号量技术. 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞 ...

  9. Ubuntu/linux c开发(4)线程池

    线程池的理解大家可以看网上的介绍,我这里用的是 Stephen Liu 的spthreadpool /** Copyright 2007 Stephen Liu* For license terms, ...

最新文章

  1. R语言as.Date函数将字符串转化为日期格式实战
  2. 不变违规:_registerComponent(...):目标容器不是DOM元素
  3. 手把手教渗透测试人员打造.NET可执行文件
  4. 人类已无法阻挡AI?围棋后AI再破最强人类堡垒,通杀智力比赛
  5. iOS Mac JSON To Model
  6. Linux下配置安装PHP环境
  7. php将已有图片缩放尺寸,PHP图片重新采样及大小缩放-imagecopyresampled用法实例
  8. ssh-copy-id配置rsync免密访问并rsync同步
  9. ADO.NET远程访问Access数据库的连接字符串
  10. Cisco NTP配置
  11. 是官方的-FeedDemon是炸弹
  12. canvas里 阿里云服务器oss图片跨域处理
  13. python爬虫 — 爬取豆瓣最受关注图书榜
  14. matlab解决推销员行程问题(可参考mathworks网站)
  15. ggplot2画histogram(坐标轴刻度值字体大小,坐标轴标题字体大小,柱形宽度,大标题字体大小、居中)...
  16. linux主机名和工作组的修改方法
  17. HTTP学习笔记(适合初学)
  18. c语言12cr,计算机二级C语言讲义12.doc
  19. adb 删除文件时提示Read-only file system问题【not in /proc/mounts】
  20. python登陆界面代码_Python-PyQt5-第一个小项目--登录框--login

热门文章

  1. phantomjs 配置和使用_phantomjs使用笔记
  2. 谷歌手机连接AirPods Pro 2存在Bug,耳机有Find My功能加持不怕丢
  3. 翻译:Face-Sensitive Image-to-Emotional-Text Cross-modal Translation for Multimodal Aspect-based Sentim
  4. 在线投票系统(限制IP地址,前端界面需要自己美化(很简单))
  5. 做国外lead,三个快速建立英文站的方法
  6. OrientDB连接数据库
  7. 关于量化交易的种种疑惑与解答
  8. 编程统计候选人的得票数。设有3个候选人,Li,Zhang,Fun。 要求输入投票总数n,然后每次输入一个得票的候选人的名字(区分大小写),若选民输错候选人姓名,则按废票处理。 选民投票结束后程序自动显
  9. 【转载】GNSS与大地测量领域在线资源获取地址
  10. c#获取本地ip地址网关子网掩码_详细介绍winformC#获得Mac地址,IP地址,子网掩码,默认网关的代码实例(图)...