C 当整个进程终止时,未连接和未分离的线程会发生什么情况?

C 当整个进程终止时,未连接和未分离的线程会发生什么情况?,c,pthreads,posix,C,Pthreads,Posix,在主线程从main()返回或调用exit()之前,应该对未调用pthread\u detach()的线程执行pthread\u join() 但是,如果不满足此要求,会发生什么情况?当进程仍然包含未连接和未分离的线程时,当进程终止时会发生什么情况 我觉得奇怪的是,这些其他线程的资源在系统重新启动之前是不会被回收的。然而,如果这些资源将被回收,那么可能就不需要麻烦加入或分离,不是吗?这取决于操作系统。典型的现代操作系统确实会回收被废弃线程使用的内存和描述符(句柄)。这类似于动态分配内存的工作方式:

在主线程从
main()
返回或调用
exit()
之前,应该对未调用
pthread\u detach()
的线程执行
pthread\u join()

但是,如果不满足此要求,会发生什么情况?当进程仍然包含未连接和未分离的线程时,当进程终止时会发生什么情况


我觉得奇怪的是,这些其他线程的资源在系统重新启动之前是不会被回收的。然而,如果这些资源将被回收,那么可能就不需要麻烦加入或分离,不是吗?

这取决于操作系统。典型的现代操作系统确实会回收被废弃线程使用的内存和描述符(句柄)。这类似于动态分配内存的工作方式:典型的现代系统会在进程退出时回收它,即使进程从未显式释放内存。对于某些不寻常的程序,这可能是一个有意义的性能优化,因为释放大量小资源需要时间,操作系统可能能够更快地完成

但是,如果不满足此要求,会发生什么情况?当进程仍然包含未连接和未分离的线程时,当进程终止时会发生什么情况

在任何使用POSIX线程的系统上,当主线程执行
SYS\u exit
系统调用时,未连接的线程只是“蒸发”到空间中

我觉得奇怪的是,这些其他线程的资源在系统重新启动之前是不会被回收的

他们会的

然而,如果这些资源将被回收,那么可能就不需要麻烦加入或分离了,不是吗

这取决于这些线程的作用。危险在于退出数据竞赛

C++
中,全局变量被销毁(通常通过
atexit
或等效的注册机制),
文件
句柄被删除,等等


如果未连接的线程试图访问任何此类资源,它很可能会与
SIGSEGV
一起崩溃,可能会产生
core
dump和不干净的进程退出代码,这两者通常都是不受欢迎的。

“典型的现代操作系统”?我认为回收动态分配的内存实际上是由POSIX保证的:在Linux glibc 2.3版和更高版本中,当您从
main()
,或调用
exit()
\u exit()
,或
\u exit()
返回时,实际上会调用;这将终止进程中的所有线程,并退出进程,释放所有正常的系统资源。(只有持久性资源(如文件、FIFO、非匿名共享内存等)才有效。)希望线程有序退出的真正原因是确保它们已完成对持久性数据的处理,而不是在写一个文件的过程中。“我会发现奇怪的是,在系统重新启动‘为什么‘奇怪’”之前,这些线程的资源将不会被回收。如果他们在进程终止时没有被释放,我会觉得奇怪。@ NoimialPixt确保他们已经完成了持久数据的工作,而不是在写一个文件的过程中,依赖此类活动进行正确操作的应用程序在首次断电或被“kill-9”或任务管理器关闭时会遇到麻烦。如果需要任何必要的文件清理,应该在进程启动时进行,而不是关闭时进行。@ThingyWotsit:这太疯狂了。我运行并行模拟,通常每个线程一个子系统。当我想让模拟提前停止时,我喜欢使用信号。我没有让进程(和所有线程)立即退出,而是使用该信号设置一个标志,告诉每个工作进程保存其状态并正常退出。我不知道你在运行或编写什么程序,但我希望我不依赖它们中的任何一个…@NominalAnimal好吧,我编写的应用程序保证在断电和进程外被管理员杀死后正确重启。我想,考虑到如今许多应用程序的脆弱性,这可能被认为是疯狂的过度设计。“当SYS_exit系统调用由主线程执行时”-为什么是“主线程”??当然,任何线程都可以?对于一个非平凡的操作系统来说,在释放线程可能访问的任何资源之前停止所有进程线程的执行是正常的(事实上是必要的)。