当前位置: 首页 > news >正文

Linux应用开发————线程池

线程池

        定义:简单来说,就是存放多个线程的池子。当创建线程池时,就给池中存放一些线程,如果有任务要执行,就从池中取出一个线程执行任务,依次类推;当所有线程都在执行任务时,其他任务暂时等待,当线程执行完任务后不会被回收,而是回到线程池中等待或继续执行其他的任务;这样同一个线程就被反复利用,从而减少创建线程,销毁线程耗时耗费资源的问题。

1.套接字+多线程

思想: 将接受客户端连接与和客户端进行数据通讯的操作分别放置在不同的线程中;

            

实现:用主线程实现接受客户端连接请求。 一旦一个客户端连接成功,则创建一个线程,在线程中实现与客户端进行数据通讯。    

                           

优缺点: 1. 思想简单,实现比较容易                         

                2. 效率低下,因服务器要频繁的创建和销毁线程。           

2.线程池                 

思想:在客户端尚未连接前,先创建一定数量的线程,并让线程处于睡眠状态。当客户端连接后,投递一个任务(就是和客户端进行数据通讯)到任务队列,并唤醒线程,线程竞争执行任务队列中的任务,当线程处理完当前任务,并不销毁(退出),而是接着处理下一次任务。

 实现:               

1.创建线程池:

typedef struct _task
{
void* (*taskfun)(void*);
void              *argp;
struct _task      *next;
}task_t;typedef struct
{
int                   thread_num;      //线程池中开启的线程数
int                   queue_num;       //任务队列当前的任务数
int                   queue_max_size;  //任务队列的容量
pthread_mutex_t       mutex;          //互斥锁
pthread_cond_t        queue_empty;    //用于阻塞线程的条件变量
pthread_cond_t        queue_full;     //用于阻塞任务添加模块的条件变量
pthread_t             *id;           //用于存储线程ID 
task_t                *head;          //任务队列的队头指针
task_t                *tail;          //任务队列的队尾指针
}threadpool_t;

2.初始化程池:                     

int  threadpool_init(threadpool_t *pool, int tnum,int qsize);

              

3.线程函数                       

功能:访问任务队列,取出每一个任务结点,执行结点函数。

               

4.任务队列                       

功能:用于协调线程与任务添加模块,也就是说任务添加模块向任务队列投递任务结点,线程取出任务结点执行。

               

5.任务添加模块                                            

功能:产生任务结点,并将任务结点投递到任务队列。               

优缺点: 1. 效率相对来讲比较高                           

                2. 实现比较复杂。

http://www.lryc.cn/news/503091.html

相关文章:

  • Spring Boot 集成阿里云OSS 完成文件上传下载
  • 使用ERA5数据绘制风向玫瑰图的简易流程
  • 测试脚本并发多进程:pytest-xdist用法
  • 数据可视化的Python实现
  • 【Linux系列】Linux 系统配置文件详解:`/etc/profile`、`~/.bashrc` 和 `~/.bash_profile`
  • uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能
  • 游戏引擎学习第45天
  • electron常用方法
  • 【Spark】Spark Join类型及Join实现方式
  • meta llama 大模型一个基础语言模型的集合
  • JAVA爬虫获取1688关键词接口
  • 操作系统——内存管理
  • android studio 模拟器不能联网?
  • CTF-WEB: 目录穿越与模板注入 [第一届国城杯 Ez_Gallery ] 赛后学习笔记
  • 数据结构6.4——归并排序
  • 【html 常用MIME类型列表】
  • Linux之vim编辑器
  • 【工具介绍】可以批量查看LableMe标注的图像文件信息~
  • 2024年山西省第十八届职业院校技能大赛 (高职组)“信息安全管理与评估”赛项规程
  • STM32完全学习——STemWin的移植小插曲
  • Java——IO流(下)
  • avue-crud 同时使用 column 与 group 的问题
  • 深入解析 Pytest 中的 conftest.py:测试配置与复用的利器
  • JAVA |日常开发中Websocket详解
  • Typora教程
  • 泛微E9常见API保姆级详解!!!!
  • UniApp配置使用原子化tailwindcss
  • 02. Docker:安装和操作
  • 【MySQL中多表查询和函数】
  • 加速科技精彩亮相ICCAD 2024