多线程服务器
2020-12-24 本文已影响0人
StevenHD
一、多线程服务器
- 线程的入口函数(回调函数)
把之前
子进程中的内容
放到线程的入口函数
即可
- 子线程创建成功后,子线程进入
入口函数
(与多进程对比)主线程是不需要关闭clntfd的,因为多线程并没有把
fd表
复制过来
-
因为多线程是共享
0~4G的内存空间
的,那么变量
也是共享的(指向的套接字也是同一个
),如果关闭了fd,就相当于释放掉了套接字,那么后续就不能进行读写了。 -
主线程创建线程成功后,也会回到accept()继续等待
-
子线程退出后,也需要
回收线程
二、回收线程
-
回收TCB
-
join()
会等待子进程退出,因为主线程阻塞在accept()那里,不能再阻塞在join()
那里 -
detach()
分离态回收线程,让线程自己回收自己
在入口函数
mythread()
中设为分离态
那么主线程(创建子线程,回收子线程)就处理结束了
三、子线程
-
pthread_create()函数的【最后一个参数】是用来
传参
的,可以传值也可以传地址
-
子线程的入口函数要退出的话,不能用exit(),因为exit()会退出整个进程,因此我们使用
pthread_exit()
-
主线程不需要监听
SIGCHLD信号
了 -
子线程中也有
write()
的过程,也要处理管道破裂的情况,并且信号是会对进程起作用的,而不是线程 -
管道破裂
SIGPIPE
发出后,有一个默认的执行动作,就是让进程挂掉,所以必须要处理SIGPIPE
这个信号