进程仅在线程终止时终止?

时间:2018-08-28 18:03:13

标签: multithreading process pthreads

  

仅当进程的所有线程都处于终止状态时,进程才应自行终止   终止!

这是我们的模拟考试中的一个问题,我们不确定该陈述是对还是错。

非常感谢

1 个答案:

答案 0 :(得分:0)

首先,我需要指出,该考试问题包含错误的推定。 始终一个正在运行的进程至少具有一个线程。初始线程(首先调用main或等效线程)并不特殊;就像pthread_create或同等功能创建的所有其他线程一样。一旦退出了进程中的所有线程,该进程将无法执行任何操作-它无法执行甚至一条额外的CPU指令。实际上,操作系统将在该点终止该过程。

第二,正如对该问题的评论所指出的那样,使用“应该”会使您的考试问题变得模棱两可。可以将其理解为“进程仅在其所有线程都终止时才终止” —作为系统工作方式的描述。或读作“您,程序员,应编写代码以确保您的进程仅在其所有线程都终止时才终止” —作为编写正确代码的 prescription

如果您专门谈论POSIX线程(“ pthreads”),那么 descriptive 问题的答案是,它取决于每个线程的终止方式。如果所有线程都通过调用pthread_exit或被取消而终止,则该过程将继续进行,直到最后一个线程终止为止,无论它们退出的顺序如何。另一方面,如果有任何线程调用exit或{ {1}}或接收到致命信号,无论有多少个线程处于活动状态,该信号都会立即终止整个过程。 (我对此不是100%的确定,但是我认为是否分离任何线程都没关系。)

还有一个复杂的问题,就是从传递给_exit的函数返回等于对该线程调用pthread_create,但是从pthread_exit返回等于调用{{1 }}。这使初始线程有些特殊:除非您通过调用main专门结束exit,否则当初始线程退出时,整个过程将终止。但是从技术上讲,这不是线程本身的属性,而是该线程中运行的代码的属性。

对于POSIX以外的线程库,我不知道 descriptive 问题的答案;尤其是我不知道Windows本机线程或2011年修订版中添加到ISO C的线程库的答案。

说明性问题的回答是“是”,但有例外。您作为程序员,应该编写在正常条件下仅当其所有线程都已完成工作时才注意结束其过程的程序。 (对于POSIX线程,这意味着要确保main在所有其他线程都加入之前不返回。)但是,有时您有几个线程运行无限循环而没有持有任何锁或任何东西,没有其他好的方法告诉他们在其他一切完成后退出。只要从它们下面退出该过程不会损坏任何持久状态,请继续并从它们下面退出该过程。 (这是分离线程的预期用例。)此外,如果遇到某种不可恢复的错误,则可以突然终止整个过程,这也是通常的最佳选择,这也是可以的。这些是我能想到的唯一例外。