努力尽今夕,少年犹可夸。这篇文章主要讲述Linux(程序设计):66---简略版的线程池设计相关的知识,希望能为你提供帮助。
一、设计线程池的优点、作用
- 在前面的文章(javascript:void(0))中我们设计过了一种线程池,但是那种线程池比较复杂代码比较多,本文介绍一个简略版的线程池
- 线程使应用能够更加充分合理的协调利用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;
//线程节点的tid
struct 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下载:javascript:void(0)。
- 或者公众号【多栖技术控小董】回复【13740168】获取下载链接。
运行
【Linux(程序设计):66---简略版的线程池设计】
- 下载代码,进入目录之后输入make编译,然后运行即可
文章图片
推荐阅读
- Linux文件权限三(特殊权限SUID SGID SBIT)
- 八mysql主从复制基础
- RHCSA评分结果
- Linux/Windows下MySQL数据库的备份与还原(mysqldump)
- Flutter Chanel通信流程
- Linux(程序设计):12---选项查询(sysconfpathconffpathconf)
- Linux(内核剖析):14---内核数据结构之链表(struct list_head)
- ceph笔记之用户权限,挂载brd/cephfs及mds高可用
- Linux(内核剖析):13---系统调用的实现与解析