线程的学习

进程的退出两大类:

正常退出 return 从main函数  exit  atexit (注册 "退出清理函数" 的函数)   

_exit

 异常退出 ---信号结束掉 abort  signal

pid_t wait(int *wstatus);

int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

功能:(1)获得子进程退出状态(2)回收资源,让僵尸态子进程销毁

注意(1)wait本身是一个阻碍操作,会使调用者阻塞;

(2)父进程获得子进程的退出状态,子进程:只有最低8位有效;

父进程wait获得退出状态值WIFEXITED()先判断是否正常退出;

WEWXITSTATUS获得退出状态值的原数字;

pid_t waitpid(pid_t pid, int *wstatus, int options);

功能:等待子进程状态发生变化

参数:pid = -1  表示等待所有子进;pid > 0   表示等待 指定的子进程状态改变

  wstatus  表示获取到 子进程 状态信息

  options  选项;可以不阻塞  WNOHANG  默认是阻塞  0

  wait(&wstatus) <=> waipid(-1,&wstatus,0)

  非阻塞调用:

  waitpid(-1,&wstatus,WNOHANG);表示非阻塞调用

  非阻塞和阻塞

  1.阻塞 会父进程处理逻辑

  2.非阻塞 父进程 会去查看 子进程状态改变;但是,如果没有发生改变,父进程不阻塞;整个程序继续往下 非阻塞 必须 套在循环中处理(轮询 )

总结:1.wait 和 waitpid都是 等待子进程状态改变

   2.wait 是一种阻塞调用

   3.waitpid 可以实现非阻塞调用

  进程退出:

  处理方式

  wait        阻塞方式:调用进程 一般不做额外的事情

  waitpid     非阻塞的方式:调用进程 逻辑一般不受影响waitpid 想要处理到子进,必须套在循环中;

多任务的技术: 线程

1.什么是线程:线程 --轻量级的进程 light weight

             进程  --重量级的进程 heavy weight

2.为什么需要线程?

 进程的产生  ----- fork

  线程 成为 CPU执行的最小单位

  进程 成为 资源分配的基本单位

  线程创建和调度时空开销都比进程小  

3. 线程组成:线程tid 号(thread) 程序计数器,寄存器集合,栈

   程序计数器 寄存器集合 栈 属于线程独立拥有,

       一条执行流;单线程进程;多线程共享进程资源;

4. 线程与进程的关系

  1.线程是存在于进程中的

  2.线程共享了进程的资源 (代码段,数据段,打开一些文件,信号等)

  3.线程结束,不一定导致进程结束

5.线程的编程

  与进程过程相似

线程—创建—执行—退出—资源的回收

  线程函数 

  (1)线程的创建  pthread_create 

  int pthread_create(pthread_t *thread,

             const pthread_attr_t *attr,

             void *(*start_routine) (void *),

                      void *arg);

   功能:该函数可以创建指定的一个线程。

       参数: thread 线程id,需要实现定义并由该函数返回。

               attr   线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)

                       默认(可结合性) -- 自己手动回收

                             分离属性       -- 系统自动回收

             start_routine  -- 线程执行函数 (线程回调函数)指向[指针函数的] 函数指针。

本质上是一个函数的名称即可。称为回调函数,是线程的执行空间。

注: 线程回调函数 --完成线程任务功能的函数(需要调用者自己实现)

              @arg  回调函数的参数,即参数3的指针函数参数。

       返回值:成功 0;失败 错误码

获得线程tid:

 pthread_self();(在哪个线程中调用,获得的就是那个线程的tid)

注:1. 主函数所在的执行流 --- 主线程

   2. 其它的线程   ---  子线程(次线程)  

   3. 各个线程间 低位是平等  //对等

(2)线程的执行   --- 就体现在线程的 执行函数(回调函数)上

(3)线程的退出

 方式1

     pthread_exit

        void pthread_exit(void *retval)

       功能:结束调用的线程

       参数:retval  退出状态值(传的是退出状态值对应的地址)

注意:pthread_exit 本身表示结束线程;如果用在main函数中 表示结束主线程结束,并不表示进程;此时,主线程执行流结束,进程会在其余线程都结束后,结束

 (4)线程的资源回收

int pthread_join(pthread_t thread, void **retval);

  功能:等待线程结束

  参数:thread  --- 线程tid 

retval  --- 用来保存,退出状态值,所在空间的地址

返回值:成功 0;失败 错误码

  注:线程退出时,可以带出退出状态值;但是传的是,退出状态值对应空间的地址

        

                    

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值