线程

2019-07-14 11:16发布

基本概念

  1. 轻量级进程,也有PCB。创建线程和进程的底层函数都是clone。
  2. 从内核看进程和线程是一样的,都有各自的PCB,但是PCB中指向内存资源的三级页表时相同的。
  3. 进程可以蜕变成线程。
  4. 线程 = 寄存器 和 栈
  5. linux下,线程时小的执行单位;进程时最小的分配资源单位。

线程间共享资源

  1. 文件描述符表
  2. 每种信号的处理方式
  3. 当前工作目录
  4. 用户ID和组ID
  5. 内存地址空间

  • text 代码段
  • data 数据段
  • bass 已初始化的全局变量,已初始化的静态变量
  • 堆 动态内存
  • 共享库 .so

线程间不共享

  1. 线程id
  2. 处理器现场及栈指针
  3. 独立的栈空间
  4. errno变量
  5. 信号屏蔽字
  6. 调度优先级

优缺点

优点:
- 提高程序的并发性
- 开销小,不需要重新分配内存
- 通信和共享数据方便 缺点
- 线程不稳定(库函数实现)
- 调试困难(gdb支持不好)
- 线程无法使用unix经典事件,例如信号

线程原语

  1. pthread_create()
    创建线程
    线程号填写到tid
    返回函数调用
  2. pthread_self()
    主线程里pthread_create()返回值tid == 子线程里pthread_self()
任何一个线程调用exit,导致进程内所有线程结束。
  1. pthread_exit
    返回的指针必须是全局的,或者malloc分配的。不能是线程栈指针。
  2. pthread_join()
    等价于wait。
    线程终止后,终止状态一直保留到其它线程调用pthread_join获取它的状态为止。
  3. pthread_cancel
    在进程内某个线程可以取消另一个线程
  4. pthread_detach
    当设置为detach时,线程一旦终止就立即回收它所占用的所有资源,不保存终止状态。

线程终止方式

  1. 从线程的主函数return
  2. 一个线程调用pthread_cancel终止同一个进程中的另一个线程
  3. 线程调用pthread_exit终止自己。

线程属性