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()函数将一些线程设置为分离态