线程
来源:互联网 发布:保健品网络推广怎么做 编辑:程序博客网 时间: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()).
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 移动站点网页设计如何打造才能更好的吸引客户呢
- salt-api 安装使用
- PAT乙级真题及训练集(11)--1004. 成绩排名 (20)
- java中 String.format与StringBuilder、String+的比较
- Java中遍历Map的四种方法
- 线程
- 找工作时如何快速了解一家公司?
- Mybatis <foreach>标签
- Android TextView行间距解析(转)
- SonarQube 6.4代码质量管理平台安装与使用
- ARP协议
- 连接对方接口得到格式xml数据
- 611. Valid Triangle Number
- HashMap的三种遍历方式