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

时间:2017-05-27 03:20:27

标签: c pthreads posix

在主线程从pthread_detach()返回或调用pthread_join()之前,预期main()未被调用的线程应该exit()

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

我觉得奇怪的是,在系统重启之前,这些其他线程的资源不会被回收。但是,如果这些资源将被收回,那么可能没有必要为加入或分离而烦恼,可能不是吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

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

在POSIX线程不是很古老的任何系统上,当主线程执行SYS_exit系统调用时,非连接线程只会“蒸发”到空间中。

  

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

他们将会。

  

但是,如果这些资源将被收回,那么可能没有必要为加入或分离而烦恼,可能不是吗?

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

C++中,全局变量被破坏(通常通过atexit或等效的注册机制),FILE句柄被删除等等。

如果非联合线程试图访问任何此类资源,它可能会因SIGSEGV崩溃,可能产生core转储,以及一个不干净的进程退出代码,这两者通常都是非常不受欢迎的。