一、线程概念
1.进程:独立地址空间,用于PCB,没有对PCB;最小分配资源单位,可看成是只有一个线程的进程
线程:有独立的PCB,没有独立地址空间;最小的执行单位。
原来的a.out从进程变为线程
命令:ps -Ls :进程ID---->线程号(LWP—>执行的最小单位)
2.内核程序映射到物理地址过程详解:
程序—>PCB—>红色圆圈—>MMU—>物理地址
红色圆圈详解:PCB里的指针—>页面—>页表—>页目录
页目录里的内存单元(小方块)直接指向物理地址
线程独立PCB,因此创建的线程指向同一个页面
页面,页表,页目录为三级页表
3.线程可看做寄存器和栈的集合
4.线程共享资源
①文件描述表
②每种信号的处理方式
③当前工作目录
④用户ID和组ID
⑤内存地址空间
5.非共享资源
①线程ID
②处理器现场和栈指针
③独立的栈空间
④errno变量
⑤信号屏蔽字
⑥调度优先级
二、相关函数
1.pthread_self函数
获取线程ID(不是线程号),其对应getpid()函数
线程ID是在进程地址空间内部,用来标识线程身份的ID号
返回类型:pthread_t类型
返回值:本线程ID
2.pthread_create函数
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
返回值:成功:0
失败:errno
参数:参1:传出参数,表新创建的子线程ID
参2:线程属性,传NULL默认属性
参3:子线程回调函数。创建成功,pthread_create函数返回时,该函数会自动调用
参4:参3的参数,没有的话,传NULL
3.pthread_exit函数
退出当前线程
参数:退出值,无退出值,传NULL
3.pthread_join函数
int pthread_join(pthread_t thread, void **retval)
4.pthread_cancel函数
int pthread_cancel(pthread_t thread)
作用:杀死线程,需要取消点,如果没有取消点,可以手动加一个pthread_testcancel()
5.pthread_detach()函数
int pthread_detach(pthread_t thread)
thread:待分离的线程ID
返回值:成功:0 失败:errorno
设置线程分离,自我回收子线程作用
6.检查出错
fprintf(stderr,“xxx error:%s\n”,strerror(ret))