关于进程和线程的疑惑

我的疑惑以判断题形式来问吧。

  1. 若一个进程创建一个线程后,这个线程正常无限运行下去(假设如此)。突然这个进程由于异常退出,则这个线程也会消失,不会存在于系统后台,windows和linux平台都是如此。
  2. 若一个进程创建一个线程A,而A里又创建线程B,创建完后,A退出结束,B依旧无限运行下去(假设如此)。突然这个进程又由于异常退出,则线程B也会消失,也不会存在于系统后台,windows和linux平台都是如此。

若不对,希望能说下理由,先行谢过各位老哥。

阅读 3.5k
3 个回答

先说多线程的情况:线程是依托于进程的,如果进程结束了,该进程内的所有线程都会结束。可以理解为每个进程至少会有一个线程:主线程。主线程所创建出来的线程,都依托于该进程。也就是说,不可能有脱离进程而独立运行的线程存在。

再说多进程的情况:Unix/Linux环境下,有三种情况:

  1. 主进程在结束前,要通过wait系统调用,等待其子进程的结束,同时回收其资源。
  2. 如果主进程没有这样做,而是不管不顾地自己结束了,那么它的子进程就都会变成孤儿进程,会被0号进程(init)接管。init会负责回收子进程的资源。
  3. 如果主进程是一个守护进程(无限运行下去的),但它由不wait自己的子进程,那么每个子进程结束后,就都会残留下一点资源释(进程入口表的一个条目)放不掉,这就形成了“僵尸进程”。随着时间的推移,会有耗尽系统资源的风险。所以要尽量避免这种情况的发生。

windows环境应该也类似,不过没什么研究。

你可以把进程看成自己的一个脚本程序的运行,你脚本程序如果挂了,不管你开什么子进程还是线程,统统消失。如果你以为它正常退出了,而实际上ps中还能看到,说明你进程或者线程没有清理干净,使得你的主程序还活着。

Windows上
前台线程终止后,程序结束,并且后台线程被终结。
进程会等待所有的前台线程完成后再结束工作,但是如果只剩下后台线程,则会直接结束工作。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题