多线程中的确保子线程退出之后 主线程退出

转载 2014年08月13日 13:14:53


Linux下编程,线程、进程退出顺序问题纷纷扰扰,如果父进程/线程先于子进程/线程终止,系统会做什么处理呢?反之,如果子进程/线程先于父进程/线程终止,系统又会做什么处理呢?下面是我个人平时在笔记上做的一些象征性的总结,如果有疑问之处,大可提出,我一直认为怀疑是人类进步的根本所在。

一、线程
Linux线程创建函数为pthread_create(),默认规则是谁创建子线程,谁就要负责子线程的资源回收,当父线程退出后,子线程也随着退出。所以,一般情况下,父线程退出时都要确保子线程已经退出,所以会使用pthread_join()函数阻塞等待子线程的退出信号/标识。
pthread_detach(threadid)函数的功能是使线程ID为threadid的线程处于分离状态(可以为非父子关系),一旦线程处于分离状态,该线程终止时底层资源立即被回收;否则终止子线程的状态会一直保存占用系统的资源直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态。被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己,因为pthread_self()这个函数返回的就是自己本身的线程ID。
1)父线程先于子线程终止
父线程先于子线程,则子线程为异常退出 ,那肯定没有使用阻塞非分离函数pthread_join,分2种情况:
a)子线程已与父线程分离,如调用线程分离函数pthread_detach,则资源被自动回收释放。
b)子线程未与父线程分离,则资源无法释放,造成了资源浪费和系统臃肿(这种情况,我看有些资料上说系统也能自动释放子线程的资源,如关闭描述符,释放内存空间等等,但个人做过一些测试,比如在子线程中分配很多空间等,进程退出后,top查看内存状态时还存在)。
2)子线程先于父线程终止
也分2种情况:
a)正常情况:子线程调用了线程分离函数ptread_detach(),或父线程调用了等待线程结束函数pthread_join()。
 b)异常情况:如果上面二者都为调用,则为子线程分配的资源无法得到释放。

二、进程
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
1)父进程先于子进程终止
当父进程先退出时,系统会让init进程接管子进程,该子线程成为了孤儿进程。
2)子进程先于父进程终止
分为2种情况:
a)正常情况:父进程调用了wait函数 (非父子进程则用waitpid函数),此时父进程会等待子进程结束。
 b)父进程又没有调用wait函数 (非父子进程则未调用waitpid函数),此种情况子进程进入僵死状态即僵尸进程,并且会一直保持下去直到系统重启。子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需。此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数。
僵死状态:一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为僵死进程(zombie)。ps命令将僵死进程的状态打印为Z 。

linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

1、介绍API 1、pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include 函数声明 int pthread_create(pt...
  • u011068702
  • u011068702
  • 2017年03月06日 21:33
  • 1241

pyqt通过信号槽机制来退出线程

刚刚解决了pyqt线程退出问题,特来此记录下解决的想法。以下用一个简单例子来表现如何用signal/slot信号槽来退出线程。 若有一个按钮,点击开始线程,再次点击退出线程,线程的工作为打印a(1-2...
  • parkour_
  • parkour_
  • 2015年05月26日 15:44
  • 2761

PyQt 分离UI主线程与工作线程

本文主要用于入门PyQt的多线程操作,包括传参数和有返回值的多线程,用到了Qt的信号和槽。有简单又具体的代码作例子用于讲解。...
  • Mr_Zing
  • Mr_Zing
  • 2015年07月18日 19:49
  • 10515

PyQt5学习笔记15----PyQt 线程相关类

QThread是我们将要详细介绍的第一个类。它也是 Qt 线程类中最核心的底层类。由于 PyQt 的跨平台特性,QThread要隐藏掉所有平台相关的代码。          正如前面所说,要...
  • a359680405
  • a359680405
  • 2015年04月23日 19:09
  • 7878

PyQt5:关闭窗口(4)

学习《PyQt4入门指南 PDF中文版.pdf 》笔记           一个显而易见的关闭窗口的方式是单击标题栏右上角的X标记。在接下来的示例中,我们将展示如何用代码来关闭程序,并简要介...
  • c3060911030
  • c3060911030
  • 2016年06月01日 00:02
  • 5651

PyQt5学习笔记14----初识pyqt多线程操作

我们的主界面有一个用于显示时间的 LCD 数字面板还有一个用于启动任务的按钮。程序的目的是用户点击按钮,开始一个非常耗时的运算(程序中我们以一个 2000000000 次的循环来替代这个非常耗时的工作...
  • a359680405
  • a359680405
  • 2015年04月23日 13:40
  • 18428

使用线程池时让所有线程都执行完再进行下一步

    我们知道,当不使用线程池时,想让A线程在B线程执行完之后执行,需要在A中的某个调用处,调用B.join,但如果使用jdk1.5以后提供的线程池ExecutorService,这个就用不上了,用...
  • theoffspring
  • theoffspring
  • 2011年06月09日 17:14
  • 11370

主线程等待子线程结束

  • 2010年05月10日 17:13
  • 15KB
  • 下载

线程问题的核心: 怎么退出线程才是合适的----小话多线程(2)

作者:陈曦 日期:2012-8-5  16:13:36 环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2 苹果开源代码Libc-763...
  • cxsjabcabc
  • cxsjabcabc
  • 2012年08月05日 16:18
  • 11145

多线程情况下,主线程先退出,子线程会被强制退出吗

1、进程中线程之间的关系 线程不像进程,一个进程中的线程之间是没有父子之分的,都是平级关系。即线程都是一样的, 退出了一个不会影响另外一个。 但是所谓的"主线程"main,其入口代码是类似这样的方...
  • fivedoumi
  • fivedoumi
  • 2016年07月08日 21:37
  • 10445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程中的确保子线程退出之后 主线程退出
举报原因:
原因补充:

(最多只允许输入30个字)