线程池

  • 多线程不断创建和退出
  • 创建线程需要申请栈空间(默认是8M),申请需要时间

如果有很多个线程创建销毁的话(有很多的时间被浪费),就会导致线程创建速度变慢。这样时间耗费在pthread_create()中,来了新的连接的时候,accept()就不能及时的处理

从而导致后面的连接不能及时的被accept()接收,从而连接在accept队列中排队,当队列排满的时候,新来的连接就会被拒绝

一、线程池

  • 重复利用一个线程
  • 不退出这个线程

pthread_create()放到accept()之前就创建好——

  • 因为线程要等待accept()分配套接字,为了不让线程空转,所以就加一个信号量从而让它等待——


创建完线程后,所有线程都会阻塞在sem_wait()那里等待

  • 信号量初始值为0

二、唤醒线程

2.1 主线程accept()

  • 什么时候唤醒线程?
    当有一个新连接的时候,就会sem_post,给信号量+1
  • 类似于消费者和生产者模型

主线程是生产者(生产套接字),子线程是消费者(使用套接字)

  • 线程处理完请求后,会回到sem_wait()那里

2.2 子线程accept()

  • 不需要信号量
  • 这种效率高(连接请求来了后可以立马accept()

accept()会有一个惊群效应——
所有的线程都处于accept()等待睡眠状态,当来了个请求的时候,所有的线程都会唤醒来争夺这个请求,从而导致某一个时间段CPU的使用率可以达到峰值
可以增加信号量或者互斥锁来处理惊群效应

主线程可以用来维护线程池

你可能感兴趣的:(线程池)