在主线程从pthread_detach()
返回或调用pthread_join()
之前,预期main()
未被调用的线程应该exit()
。
但是,如果不满足此要求会发生什么?如果进程在仍包含未连接且未分离的线程时终止,会发生什么?
我觉得奇怪的是,在系统重启之前,这些其他线程的资源不会被回收。但是,如果这些资源将被收回,那么可能没有必要为加入或分离而烦恼,可能不是吗?
答案 0 :(得分:0)
由操作系统决定。典型的现代操作系统确实将回收废弃线程使用的内存和描述符(句柄)。这类似于动态分配的内存的工作方式:典型的现代系统将在进程退出时回收它,即使进程从未明确释放内存。对于某些不寻常的程序,这可能是一个有意义的性能优化,因为释放大量小资源需要时间,操作系统可能能够更快地完成。
答案 1 :(得分:0)
但是,如果不满足此要求会发生什么?如果进程在仍包含未连接且未分离的线程时终止,会发生什么?
在POSIX线程不是很古老的任何系统上,当主线程执行SYS_exit
系统调用时,非连接线程只会“蒸发”到空间中。
我觉得奇怪的是,在系统重启之前,这些其他线程的资源不会被回收。
他们将会。
但是,如果这些资源将被收回,那么可能没有必要为加入或分离而烦恼,可能不是吗?
这取决于这些线程的作用。危险在于退出数据竞赛。
在C++
中,全局变量被破坏(通常通过atexit
或等效的注册机制),FILE
句柄被删除等等。
如果非联合线程试图访问任何此类资源,它可能会因SIGSEGV
崩溃,可能产生core
转储,以及一个不干净的进程退出代码,这两者通常都是非常不受欢迎的。