之前我们已经介绍过进程的基本概念linux 判断线程是否在运行,那么线程是什么? 线程是进程内部的一个执行分支,举个栗子:比如一个项目的完成是多个团队之间的合作,和每个团队都是这个项目运行的一个分支。即线程是进程内部的执行分支。
进程的特点: (1)系统中程序执行和资源分配的基本单位 (2)每个进程都有自己的数据段、代码段、堆栈区 (3)在进行切换时需要比较复杂的上下文切换
线程特点: (1)减少处理机的空转时间,支持多处理器以及减少上下文切换开销,比创建进程小很多 (2)进程内独立的一条运行路线 (3)线程是CPU调度的基本单位(有多个执行流时才需要调度)linux命令详解词典,也成为轻量级进程
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-线程函数的起始地址linux 判断线程是否在运行,是一个以指向void的指针作为参数和返回值的指针,arg-传递给start_routine的参数。成功返回0,失败返回错误码。
运行结果如下:
退出线程:pthread_exit() reval-线程结束时的返回值,可由其他函数如pthread_join()来获取。 exit是退出进程,不能用来退出线程。
在任何一个时间点上,线程是可结合的或者分离的。一个可结合的线程能够被其他线程收回其资源和杀死。在其他资源回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
等待线程:pthread_join() th-等待线程的标识符 thread_return-用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)。成功放回,出错返回错误码。 由于一个进程中的多个线程是共享数据段的,通常在线程退出之后,退出线程所占用的资源并不胡随着线程的终止而得到释放,等待方式为阻塞时等待。
取消线程:pthread_cancel() th-要取消的线程的标识符。成功返回,出错返回错误码。 作用:取消同一进程中的其他线程,被取消的线程可以设置自己的取消状态,被取消的线程接收到另一个线程的取消请求后,是接受还是忽略这个请求linux软件,如果接受,是立刻进行终止操作还是等待某个函数的调用等。
进程分离:pthread_detach() 将子线程设置为分离的,则线程结束后会自动释放所有资源。