【问题标题】:Question about zombie processess and threads关于僵尸进程和线程的问题
【发布时间】:2011-04-22 20:47:54
【问题描述】:

我有这些问题,因为我正在阅读一些关于进程和线程的新主题。如果有人可以帮助我,我会很高兴。

1) 如果一个线程被标记为不可取消,然后进程在临界区内被杀死,会发生什么?

2) 我们是否有操作系统已知的程序的主线程?我的意思是操作系统是否赋予程序的第一个线程一些有益的权利或什么?

3) 当我们杀死一个进程并且线程没有加入时,它们会变成僵尸吗?

【问题讨论】:

  • 这里还有一个问题,线程如何共享正在运行的进程的堆栈?堆栈是否包含它们全部或它们是否在线程之间切换时从堆栈中抢占?

标签: linux process thread-safety pthreads zombie-process


【解决方案1】:

首先,不要杀死或取消线程,让它们杀死自己。如果你从外部杀死一个线程,你永远不知道你留下了什么副作用——变量、同步原语的状态等。如果您发现一个线程有必要终止另一个线程,则让有问题的线程检查开关、捕获信号等,并在退出之前清理其状态。

1) 如果不可取消是指分离,则与连接线程相同。如果你盲目地杀死它,你不知道你会留下什么烂摊子。

2) 从应用程序级别的角度来看,主要的事情是,如果主线程退出()或返回(),它将与它一起取消所有其他线程。如果主线程使用 pthread_exit() 自行终止,则其余线程继续运行。

3) 与进程非常相似,线程将保留一些资源,直到它被收割(加入)或程序结束,除非它以分离的方式运行。

RE 注意:线程不共享它们各自拥有的堆栈。有关线程创建的一些信息,请参阅clone()

【讨论】:

  • 感谢您的回答,首先我不是说分离,我的意思是当它将自己标记为 PTHREAD_CANCEL_DISABLE 时。另外,“每个都有自己的”是指进程堆栈还是有差异?
  • 对 (1) 感到抱歉。如果进程被杀死而不是取消,我认为不会调用清理处理程序。 IOW 取消点是通过 pthread 库操作的;他们不会阻止线程被操作系统击中。不过,这将是一个不错的周末小测试项目。 AFAIK 堆栈没有区别,它只是每个线程的一块连续内存。
猜你喜欢
  • 2010-11-12
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多