Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 进程仅在线程终止时终止?_Multithreading_Process_Pthreads - Fatal编程技术网

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

Multithreading 进程仅在线程终止时终止?,multithreading,process,pthreads,Multithreading,Process,Pthreads,进程只应在其所有线程都已终止时自行终止 终止 这是我们模拟考试中的一个问题,我们不确定这句话是真是假 非常感谢首先,我需要指出这道试题包含了一个错误的假设。正在运行的进程始终至少有一个线程。初始线程,即第一个调用main或等效线程的线程,并不特殊;它就像由pthread\u create或等效程序创建的所有其他线程一样。一旦一个进程中的所有线程都退出,该进程就不能再做任何事情了——它甚至无法执行一条额外的CPU指令。实际上,操作系统将在该点终止进程 第二,正如在对问题的评论中指出的,使用“应该”

进程只应在其所有线程都已终止时自行终止 终止

这是我们模拟考试中的一个问题,我们不确定这句话是真是假


非常感谢

首先,我需要指出这道试题包含了一个错误的假设。正在运行的进程始终至少有一个线程。初始线程,即第一个调用
main
或等效线程的线程,并不特殊;它就像由
pthread\u create
或等效程序创建的所有其他线程一样。一旦一个进程中的所有线程都退出,该进程就不能再做任何事情了——它甚至无法执行一条额外的CPU指令。实际上,操作系统将在该点终止进程

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

如果您专门讨论POSIX线程(“pthreads”),那么描述性问题的答案是它取决于每个线程的终止方式。如果所有线程都通过调用
pthread\u exit
或通过被取消来终止,则该进程将一直持续到最后一个线程终止,无论它们以何种顺序退出。另一方面,如果任何线程调用
exit
\u exit
,或接收到致命信号,则无论有多少线程仍处于活动状态,都会立即终止整个进程。(我不是100%确定这一点,但我认为是否已分离任何线程并不重要。)

还有一个额外的复杂性,即从传递给
pthread\u create
的函数返回相当于为该线程调用
pthread\u exit
,但从
main
返回相当于调用
exit
。这使得初始线程有点特殊:除非通过调用
pthread_exit
明确结束
main
,否则当初始线程退出时,整个进程将终止。但从技术上讲,这不是线程本身的属性,而是该线程中运行的代码的属性

对于POSIX以外的线程库,我不知道描述性问题的答案;特别是,我不知道Windows本机线程的答案,也不知道2011年版本中添加到ISO C中的线程库的答案


这个规定性问题的答案是肯定的,但也有例外。作为程序员,您应该编写程序,在正常情况下,只在所有线程都完成工作时才注意结束进程。(对于POSIX线程,这意味着要确保
main
不会返回,直到所有其他线程都已连接起来。)然而,有时您有几个线程运行无限循环,没有任何锁或任何东西,并且在完成所有其他操作时,没有好的方法告诉它们退出;只要从它们下面退出进程不会损坏任何持久状态,就可以继续从它们下面退出进程。(这是分离线程的预期使用情形。)此外,如果遇到某种不可恢复的错误,可以突然终止整个过程,这通常是最佳选择。这些是我脑海中唯一能想到的例外情况。

这是为什么会有“c”标签?问题中没有“c”代码。这里应该怎么读“进程应该只终止它们自己…”?作为“这就是发生的吗?”或者“这是程序编写的方式吗?”我们在这里学习C语言module@duskwuff应该如此written@xXMariusXx:如果您了解本机C线程、pthread或一般线程。只有第一个C标记是相关的。他说,因为这个问题是作为建议写的,所以肯定没有错。事实上,即使用“应”这个词来形容,也应该是。问题是谁对终止合同负责。现在应该清楚了,这是一个典型的考试题,没有上下文就无法令人满意地回答。