我是靠谱客的博主 英俊小兔子,最近开发中收集的这篇文章主要介绍线程创建、等待、终止,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

                           线程概念

  main函数和信号处理函数是 同一个进程地址空间中的多个控制流程,多线程一样。
  信号处理函数的控制流程只是在信号抵达时产生,在处理完信号后就结束了;多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,像在多个进程之间相互切换一样。        
  同一进程的多个线程共享同一进程地址空间,所以 代码段、数据段都是共享的,eg:定义一个函数,在各线程中都可以调用;定义一个全局变量,各线程也都可以访问。
   各线程共享一下进程资源和环境:   
     1.文件描述符表
     2.每种信号的处理方式(SIG_IGN、SIG_DFL 或者自己定义的信号处理函数)
     3.当前工作目录    
     4.用户id 、组id
  每个线程私有的资源:
     1. 线程id
     2.上下文,包括各种寄存器的值、程序计数器、栈指针
     3.栈空间
     4.errno变量
     5.信号屏蔽字            
     6. 调度优先级
  接下来学习的线程库是由POSLX标准定义的,称为POSLX thread  或者 pthread。在Linux下线程函数位于libpthread共享库中,所以在编译时要加上-lpthread选项。

  线程控制

(一) 创建线程
这里写图片描述

->thread->线程id、attr->线程属性(可分离、可结合(默认))、start_routine->创建的线程的执行流(即线程对应的函数)、srg->执行流的参数
-> 返回值:成功返回0;失败返回错误号。
-> 以前学过的系统函数都是成功返回0,失败返回 -1,而错误号保存在全局变量errno中,pthread库的函数都是通过返回值返回错误号,虽然每个线程都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。
在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行。
start_routine返回时,这个线程就退出了,其他线程可以通过调用pthread_join得到start_routine的返回值,类似于父进程调用wait(2)得到子进程的退出状态。
等待进程的作用:
1、避免僵尸进程
2、读取子进程的退出结果
3、同步父子进程的执行流
(二)获取线程id
这里写图片描述
此函数获取线程自己的id,类似于进程中的getpid().
调用此函数获得的各个线程的id是不同的,但对于同一进程中的线程来说,他们的进程号都与创建他们的进程的pid相同。
(三)只终止线程而不终止进程的三种方法
1、从要终止的线程函数中return,但从主线程return相当于终止整个进程
2、线程调用pthread_exit来终止自己
这里写图片描述
retval->线程的退出码
retval是void*类型,和线程函数返回值的用法一样,其他线程可以调用pthread_join获取到这个指针
pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回值时线程函数已经退出了。
3、一个线程可以调用pthread_cancel 终止同一进程中的另一个线程
这里写图片描述
thread->要取消的线程的id
该函数终止线程时,现成的退出码是-1,他是一个宏、PTHREAD_CAMCELED
查看宏指令:#grep -R PTHREAD_CANCELED /usr/include/
这里写图片描述
(四)线程等待
这里写图片描述
thread->被等待的那个线程 retval->通过它得到线程的退出码
返回值:成功返回0,失败返回错误号
调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的:
1、如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值
2、如果thread线程是被别的线程调用thread_cancel异常终止,valure_ptr所指向的单元里存放的是常数PTHREAD_CANCELED (-1)
3、如果thread线程是自己调用pthread_exit终止的,valure_ptr所指向的单元里存放的是传给pthread_exit的参数。如果对thread线程的终止状态不感兴趣,可以传NULL给valure_ptr参数。

    一般情况下,线程终止后,其终止状态一直保留到其他线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。

这里写图片描述

返回值:成功返回0,失败返回错误号
不能对同一线程调用两次pthread_join 或者 如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
(五)终止进程方法
1、从main函数return
2、从任意地方调用exit(退出码)

最后

以上就是英俊小兔子为你收集整理的线程创建、等待、终止的全部内容,希望文章能够帮你解决线程创建、等待、终止所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部