Linux线程的基础知识

来源:互联网 发布:ark网络加速器 安卓版 编辑:程序博客网 时间:2024/05/22 03:06

之前我们已经介绍过进程的基本概念,那么线程是什么?
线程是进程内部的一个执行分支,举个栗子:比如一个项目的完成是多个团队之间的合作,和每个团队都是这个项目运行的一个分支。即线程是进程内部的执行分支。

进程的特点:
(1)系统中程序执行和资源分配的基本单位
(2)每个进程都有自己的数据段、代码段、堆栈区
(3)在进行切换时需要比较复杂的上下文切换

线程特点:
(1)减少处理机的空转时间,支持多处理器以及减少上下文切换开销,比创建进程小很多
(2)进程内独立的一条运行路线
(3)线程是CPU调度的基本单位(有多个执行流时才需要调度),也成为轻量级进程

linux中没有真正意义上的线程,所以我们用进程模拟线程,如下图:
这里写图片描述

各线程之间共享以下资源和环境:
(1)文件描述符表
(2)每种信号的处理方式(SIG_IGN, SIG_DFI或者用户自定义的信号处理函数)
(3)当前工作目录
(4)用户id和组id
任何线程对系统资源的操作都会给其他线程带来影响

各线程私有以下资源:
(1)线程id
(2)上下文,包括各种寄存器的值,程序计数器和栈指针
(3)栈空间
(4)error变量
(5)信号屏蔽字
(6)调度优先级

Linux下的线程库函数是由POSIX标准定义的,称为POSIX thread或pthread。linux中线程函数位于libpthread共享库中,因此在编译时要加上Ipthread。

线程标识:
线程id
进程id在整个系统中是唯一的,线程id只在它所属的进程环境中有效
函数:pthread_self()
这里写图片描述
返回值:调用线程的id

pthread_t类型通常用结构体表示,不能把它作为整数处理(linux使用无符号长整数表示),为了移植,使用函数来比较线程:pthread_equal()
这里写图片描述
若两个线程id相等则返回非0值。否则返回0.

创建进程:pthred_create
这里写图片描述
参数的含义:thread-线程标识符、attr-线程属性设置,通常取NULL、start_routin-线程函数的起始地址,是一个以指向void的指针作为参数和返回值的指针,arg-传递给start_routine的参数。成功返回0,失败返回错误码。

这里写图片描述

运行结果如下:
这里写图片描述

退出线程:pthread_exit()
这里写图片描述
reval-线程结束时的返回值,可由其他函数如pthread_join()来获取。
exit是退出进程,不能用来退出线程。

在任何一个时间点上,线程是可结合的或者分离的。一个可结合的线程能够被其他线程收回其资源和杀死。在其他资源回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

等待线程:pthread_join()
这里写图片描述
th-等待线程的标识符
thread_return-用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)。成功放回,出错返回错误码。
由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不胡随着线程的终止而得到释放,等待方式为阻塞时等待。

取消线程:pthread_cancel()
这里写图片描述
th-要取消的线程的标识符。成功返回,出错返回错误码。
作用:取消同一进程中的其他线程,被取消的线程可以设置自己的取消状态,被取消的线程接收到另一个线程的取消请求后,是接受还是忽略这个请求,如果接受,是立刻进行终止操作还是等待某个函数的调用等。
这里写图片描述
这里写图片描述

进程分离:pthread_detach()
这里写图片描述
将子线程设置为分离的,则线程结束后会自动释放所有资源。
这里写图片描述
这里写图片描述