线程

来源:互联网 发布:保健品网络推广怎么做 编辑:程序博客网 时间:2024/06/06 17:56

什么是线程?
线程也被称为轻量级进程,是进程内部的一个执行分支,是程序执行流的最小单位(调度的最小单位)。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。一个进程中可以有多个线程,其本质是多个线程在同一进程的地址空间运行。

线程不拥有系统资源,但它共享所属进程的资源(文件描述符表,各种信号的处理方式,用户id和组id,当前工作目录)。但有些资源是线程独自享有的(线程ID,上下文信息(各种寄存器的值,程序计数器,栈指针),栈空间,error变量,信号屏蔽器,调度优先级),同一进程中的多个线程之间是并发执行的。

线程相关控制

线程创建
这里写图片描述
当一个线程调用该函数生成新的线程时,它自己从该函数返回并继续向下执行,而新的线程执行的代码由第三个参数决定,这个参数是一个函数指针,而start_routine函数接受一个参数是通过pthread_create()第四个参数rag传递给他的。第三个参数和第四个参数都是由用户自己定义,当新的线程从start_routine函数返回时就退出了,第二个参数表示线程属性,我们取缺省值。
注:如果任意一个线程调用exit()或_exit(),都会使得所属进程中的所有线程终止。在主函数中return也相当于调用exit。

线程终止
如果你想终止某个线程而不使的其他线程同时终止,有三种方法:
1,在线程函数中return;(对主线程无效,main中return相当于exit)
2,一个线程调用pthread_cancel(),可以终止同一进程中的另外一个线程;(分为同步,异步两种)
3,调用pthread_exit(),线程可以终止自己。
这里写图片描述

使用pthread_exit函数终止线程,是主动行为,但是线程退出时,线程所占用的资源并不会被释放,但是可以用pthread_join函数来同步并释放资源。pthread_exit函数的唯一的参数retval是线程退出时返回的值(可能是一个数值,也可能是一个结构体),只要pthread_join函数的第二个参数value_ptr不为NULL,他就会这个值将被传递给value_ptr,即返回的数据将被存储在value_ptr指向的地址,所以返回的变量必须是全局变量或malloc动态分配的,即不能在线程的栈空间上(函数退出时局部变量就会被释放),否则导致pthread_join访问可能是非法访问。
而pthread_cancel函数是向目标线程发出cancel信号,但如何处理该信号取决于目标线程,或者忽略,或立即终止,或运行至cancelation_point(取消点),由不同的cancelation状态决定。
线程等待
这里写图片描述
为什么进行线程等待?
如果一个可结合线程结束运行但没有经过join,即 没有显示的回收线程占有的资源,它的状态就类似进程中的僵尸进程。所以调用join是为了等待线程终止后得到他的返回码,回收其资源。
调用函数pthread_join的线程被挂起直至第一个参数thread代表的线程终止为止。该函数是一个线程阻塞函数。由于线程thread的终止方式不同,所以通过pthread_join得到的终止状态是不同的。
1,如果thread是通过return返回的,value_ptr所指向的单元里存thread线程函数的返回值。
2,如果是被pthread_cancel异常终止掉,则存放常数PTHREAD_CANCELED(-1)。
3,如果是主动终止(调用pthread_exit),则存放传给pthread_exit的参数)。

注:如果对thread线程的终止状态不感兴趣,可以传NULL给参数value_ptr。
一般情况线程退出后它的终止状态会一直保留到其他线程调用pthread_join获取他的状态为止。但是线程也可以被置为detach状态,这种线程一旦终止立即收回他占有的所有资源,且不会保留它的终止状态。
线程分离
为什么进行线程分离?
线程可能是可结合的,也可能是可分离的。可结合的线程可以被其他线程杀死和收回其资源,在被其他线程回收之前,它的资源是不释放的。而可分离的资源是不能被其他线程杀死的,当他终止时资源由系统自动释放。而进程等待是线程阻塞函数,所以将进程状态设置为可分离,这样线程结束时会自动释放资源。
设置方式:父线程调用pthread_detach(thread_id)或子线程自己调用pthread_detach(pthread_self()).

原创粉丝点击