多线程
线程创建:生成线程需要激活进程
同比进程:多个线程使用相同的地址空间,共享大部分数据
启动线程耗费的时间空间远小于进程间切换所需要的。
通讯机制
进程有独立的PCB和地址空间,线程有PCB但
进程在调用线程函数ptherad_create()下,PCB裂变出两个线程(几个线程公用一个PCB)。
线程为最小执行单位,进程为最小分配资源单位。
ps -Lf 进程id →LWP线程号
实现线程原理
1.轻量级进程拥有PCB,创建线程使用的底层函数和进程均为clone
2.进程内线程PCB指向内存资源的三级页表一致
3.进程可以蜕变为线程
4.每一个线程都有独立的寄存器和栈,故线程可看作寄存器和栈的集合
三级映射:进程PCB→页目录(可看成数组,首地址位于PCB中)→页表→物理页面→内存单元
多线程遵循POSIX线程接口,称为pthread。编写linux下的多线程程序,需要使用头文件pthread.h。
pthread在头文件pthreadtypes.h中定义:
typedef unsigned long int pthread_t:线程描述符
线程共享:
文件描述符表
每种信号的处理方式
当前工作目录
用户ID和组ID
内存地址空间()、共享全局变量
非共享:
线程ID 线程标识符
处理器现场和栈(用于标识核的运行状态)指针
核的栈空间
errno变量
信号屏蔽字
调度优先级
线程优缺点
程序并发性(切换线程依然需要时间)、开销小、数据通信共享数据方便
属于库函数,不稳定 调试编写困难、gdb不支持(相比于底层代码编写) 对信号支持不好(gdb开发时)。
pthread_self函数
获取当前程序的线程ID,对应进程的getpid()
pthread_t pthread_self(void);
成功返回线程id 失败返回"无!"
创建线程
pthread_create
int pthread_creatr(pthread_t *thread(传出参数,保存系统为我分配好的新线程ID),const pthread_attr_t *attr(传入*attr所指向的内容不能修改,或传入常量),void *(*start routine)(void*)(传入回调函数地址,函数名就是地址,所有传函数名),void *arg(传入回调函数需要的参数));
成功返回0,失败:错误码
arg传参注意事项:
pthread_exit函数
pthread_exit;
return NULL;返回至调用函数的位置
exit();所有线程都被结束
join函数
pthread_join(thread(线程id变量名),void **retval(指针));
分离状态detach
int pthread_detach(pthread_t thread(线程ID));
成功0 失败错误号
什么叫分离状态?
分离状态时干什么的?