Linux THREAD 线程技术

NPTL(Nativ Posix Thread Library)

1.几种线程类型

  • 用户级线程
    1. 用户级线程无法被系统识别为调度单位,所以不会分发跟多的CPU使用资源(时间片)
    2. 用户级线程无需系统干预,因定义与使用全部在用户层完成,上下文切换,调度执行速度更快(系统开销更小)
    3. 用户级线程不受系统限制,即不支持线程技术的linux或Unix系统,也可以安装使用

  • 内核级线程 16.04 ubuntu NPTL为内核级线程
      这类系统支持线程技术,这些线程统称为内核级线程,系统可以识别这些线程并且为每一个线程分配cpu资源,如果线程使用期间,发生中断异常等等系统调用,那么内核会高度参与,频繁进行层级转换,每个内核级线程都是一个系统可识别的调度单位

      内核级线程系统开销较大

  • 混合型线程
      线程的定义和安装在用户层完成,使用时无需内核高度参与,即可以极小的开销完成任务,会为每个线程创建一个内核对象,便于分发cpu资源

2.进程蜕化概念

  • 进程可以获取系统内存,内部自带调度单元完成特定任务
  • 某个执行单元独占所有系统资源,则为进程
  • 大多数情况下,初始时普通线程由主线程创建,后期普通线程间也可以创建或回收
  • 线程间没有操作限制,线程间可以进行创建、回收、取消
  • 如果某一刻内存资源共享,这时进程蜕化为主控线程

3.线程资源分配

4.线程间共享资源与非共享

  共享:
    全局资源(全局变量、静态变量)
    堆空间共享(共享堆)
    PCB进程信息共享
    文件描述符表共享
    信号行为共享
    用户资源共享(uid, gid)

  非共享:
    线程栈非共享(8M虚拟内存)
    信号屏蔽字非共享
    线程调度优先级非共享
    TCB线程控制块非共享
    ERRNO全局变量非共享(使用线程时系统为每个线程分配一个错误号,通过错误号查找错误信息)

  线程技术的一些优缺点:

  优点:
    1. 多线程技术内存开销较小,共享使用更多进程资源
    2. 用户级线程无需高度依赖系统,安装即可使用
    3. 线程可以方便共享全局资源


  缺点:
    1. 线程稳定性较差,某一个线程出现异常,系统以进程为单位杀死
    2. 复杂的多线程模型开发难度较高,需要考虑线程安全,线程调度与控制

NPTL函数(线程源语)

  #线程创建
    int err = pthred_create(pthread_t* tid,pthread_attr_t* attr,void* (rjobs)(void* ),void* arg)

  #线程tid获取
    pthread_t tid = pthread_self()#返回调用线程tid



  #线程取消
    pthread_cancel(pthread_t tid) #可以通过系统事件,取消结束某个目标线程


  #线程回收
    pthread_join(pthread_t tid,void** reval)#除了回收线程的tcb资源外,还可以将线程返回值或退出码获取到,进行二次检测



  #线程分离态
    1. 线程被创建后,某人都是会回收态线程,这类线程结束后需要手动回收,通过pthread_join
    2. 如果用户不想回收,那么可以将回收态线程改变为分离态线程,分离态线程结束后系统自动回收线程资源,无需用户干预
    3. pthread_detach(pthread_t tid) #通过这个函数将线程设置为分离的(线程退出状态转换)
    4. 线程函数的使用没有明确限制,所有线程只要得到对方的tid,就可以进行回收分离等等操作
    5. 分离态与回收台是互斥的,线程只能保持一种状态,如果对一个分离线程进行回收操作,回收会失败,同理,对一个已经处于回收阶段(正在回收),那么设置分离会失败

  #线程的几种退出方式

    exit(0):无论是主线程调用,还是普通线程调用,直接关闭结束进程,杀死所有线程,一般该函数退出处理才使用
    return 0:主线程return,整个进程结束退出,普通线程工作使用return,只有当前线程结束,并返回0
    pthread_cancel:可以通过该函数取消一个目标线程
    pthread_exit():无论是主线程还是普通线程,调用该函数导致线程退出,不影响整个进程

  默认情况下,一个线程被cancel取消掉,使用join回收时会得到-1,我们可以根据此返回值,察觉取消事件,线程工作代码实现时,退出码不允许使用-1,一定要保留cancel

  #线程属性,定制线程,在线程创建前就决定线程的一些内部状态


  #修改属性的固定流程


  修改信息,提高线程数量


  何时使用属性修改分离,何时使用detach函数

    多线程模型中,大量使用分离线程,我们可以通过属性,进行批量分离线程创建

    如果是混合型多线程,一部分回收处理,一部分分离设置,可以通过detach()函数将一些线程设置为分离态

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌霄online

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值