- 多线程不断创建和退出
- 创建线程需要
申请栈空间(默认是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的使用率可以达到峰值
可以增加信号量
或者互斥锁
来处理惊群效应
主线程
可以用来维护线程池