基本概念
- 轻量级进程,也有PCB。创建线程和进程的底层函数都是clone。
- 从内核看进程和线程是一样的,都有各自的PCB,但是PCB中指向内存资源的三级页表时相同的。
- 进程可以蜕变成线程。
- 线程 = 寄存器 和 栈
- linux下,线程时小的执行单位;进程时最小的分配资源单位。
线程间共享资源
- 文件描述符表
- 每种信号的处理方式
- 当前工作目录
- 用户ID和组ID
- 内存地址空间
- text 代码段
- data 数据段
- bass 已初始化的全局变量,已初始化的静态变量
- 堆 动态内存
- 共享库 .so
线程间不共享
- 线程id
- 处理器现场及栈指针
- 独立的栈空间
- errno变量
- 信号屏蔽字
- 调度优先级
优缺点
优点:
- 提高程序的并发性
- 开销小,不需要重新分配内存
- 通信和共享数据方便
缺点
- 线程不稳定(库函数实现)
- 调试困难(gdb支持不好)
- 线程无法使用unix经典事件,例如信号
线程原语
- pthread_create()
创建线程
线程号填写到tid
返回函数调用
- pthread_self()
主线程里pthread_create()返回值tid == 子线程里pthread_self()
任何一个线程调用exit,导致进程内所有线程结束。
- pthread_exit
返回的指针必须是全局的,或者malloc分配的。不能是线程栈指针。
- pthread_join()
等价于wait。
线程终止后,终止状态一直保留到其它线程调用pthread_join获取它的状态为止。
- pthread_cancel
在进程内某个线程可以取消另一个线程
- pthread_detach
当设置为detach时,线程一旦终止就立即回收它所占用的所有资源,不保存终止状态。
线程终止方式
- 从线程的主函数return
- 一个线程调用pthread_cancel终止同一个进程中的另一个线程
- 线程调用pthread_exit终止自己。
线程属性