linux网络编程11——线程池

[复制链接]
发表于 2025-11-7 00:21:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 线程池

1.1 池化技能原理

池化技能
当一个资源或对象的创建大概烧毁的开销较大时,可以利用池化技能来保持肯定命量的创建好的对象以供随时取用,于是就有了池式结构。常见的池式结构包罗线程池、内存池和毗连池。
池化技能应用的条件条件重要包罗三个,总结一下,以供影象:
      
  • 资源是可复用的。在盘算机中,大部分资源都是可复用的,比方内存、线程、历程、tcp毗连等。  
  • 资源可以长时间生存。像分配的内存块、已创建的线程、创建的TCP毗连,都是可以长时间存在。  
  • 资源创建和烧毁的开销较大。如动态内存分配,涉及体系调用和上下文切换,开销较大。
1.2 线程池原理

线程池
线程池是一种维持管理固定命量线程的池式结构。本文解说了线程池的结构计划和实现。
下图是一个线程池的范例机构:

此中重要包罗三个部件:

      
  • 生产者线程,是线程池的利用者,它通过向任务队列转达任务交给消耗者线程实行。  
  • 任务队列。是一个先辈先出的队列,由于插入和删除元素都只必要在一段举行读写,因此临界区很短,比力高效。  
  • 消耗者线程,负责从任务队列中取出任务并实行。
下图是一个消耗者线程的状态转换图。从图中可以看到,当任务队列不为空时,消耗者线程就不绝从中取出任务并实行,否则就会陷入期待态。

线程池的作用
      
  • 性能优化,异步实行耗时任务,不外度占用核心线程,可以大概进步相应速率和性能。耗时任务可来自于:IO麋集型任务(如网络IO和磁盘IO)、CPU麋集型任务。  
  • 并发实行,充实利用多核,并发实行核心业务。  
  • 复用线程资源,镌汰创建和烧毁线程的开销。
线程数量怎样确定
线程数量取决于任务范例和cpu核心数量。

      
  • cpu麋集型:cpu核心数量  
  • io麋集型: cpu核心数量 * (线程期待时间+cpu运算时间) / cpu运算时间
1.3 线程池的应用场景

1.3.1 nginx中的线程池

nginx中的线程池被用于处理惩罚文件IO。nginx重要有两个功能,分别是反向署理和提供静态文件资源。
在文件IO中,必要通过内核调用发送数据,涉及到内核态和用户态之间的上下文切换以及数据向内核缓冲区的传输,如果这些利用放在主线程实行将会导致肯定的期待时间,减低了相应速率。
因此nginx利用线程池来分离耗时的利用,尤当时文件IO,制止其对主线程的干扰,从而提升 Nginx 的团体性能和相应服从。
1.3.2 redis中的线程池

Redis 默认环境下是单线程的,即它仅开启一个主线程来处理惩罚全部的哀求。这也是 Redis 不绝以来的计划理念,即利用单线程模子实现高性能。
不外,Redis 在 6.0 版本中引入了多线程支持,用于处理惩罚客户端的网络读写(如数据的读取、协议分析等),这可以提升在高并发环境下的网络 I/O 性能。
redis的线程池重要用于IO读写和协议分析,不负责实行利用。
1.4 线程池的实现

下面是一个利用C++11写的利用壅闭队列实现的线程池。
先看代码,然后举行解说。
  1. #include <stdio.h>
  2. #include <chrono>
  3. #include <condition_variable>
  4. #include <functional>
  5. #include <mutex>
  6. #
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表