【C】高并发线程池设计

2023-05-13 14:36:24 浏览数 (2)

高并发线程池设计

并发基本概念

  • 所谓并发编程指的是在同一台计算机上"同时"处理多个任务。
  • 并发是在同一实体上的多个事件。

处理事件过程出现阻塞

  • 漫长的CPU密集型处理。
  • 读取文件,但文件尚未缓存,从硬盘中读取较为缓慢。
  • 不得不等待获取某个资源:
    • 硬件驱动
    • 互斥锁
    • 等待同步方式调用的数据库响应
    • 网络上的请求和响应

多线程的缺陷

  • 单个进程或线程同时只能处理一个任务,如果有很多请求需要同时处理怎么办?
  • 解决方案——运用多进程或多线程技术解决。
  • 缺陷:
    • 创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在处理实际用户请求的时间和资源要多的多。
    • 活动的线程需要消耗系统资源,如果启动太多线程,会导致系统由于过度消耗内存或"切换过度"而导致系统资源不足。
      • 线程切换时,该线程执行的相关信息会被保存在对应的上下文中,线程数越多,所用于切换的时间就越多。
  • 解决:——使用线程池技术。

线程池

  • 线程池
    • 由一个任务队列和一组处理任务队列的线程组成。一旦工作进程需要处理某个可能"阻塞"的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。
  • 注意:
    • 线程中的线程都要从任务队列中拿任务(同一个任务只允许一个线程拿到),会修改任务队列的链表,进程往里面加入新的任务也会修改任务队列的链表,二者无法同时修改,所以任务队列为临界资源,所以这里要实现同步与互斥。

线程池的核心组件

  • 任务——待处理的工作,通常由标识、上下文和处理函数组成。
  • 任务队列——按顺序保存待处理的任务序列,等待线程中的线程组处理。
  • 线程池——由多个已启动的一组线程组成。
  • 条件变量——一种同步机制,允许线程挂起,知道共享数据上的某些条件得到满足。
  • 互斥锁——保证在任意时刻,只能有一个线程访问该对象。

Nginx线程池解析

  • 注: 如下代码为本人看的某个视频中的资料,从Nginx中c抽下来的,貌似与最新的Nginx源码并不是很相同,因为经过删减,而且不是删减的最新版,但是大致意思我想应该是差不多的。

    0 人点赞