对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程。
那如果是把进程换成线程的话,会怎么样呢?假设主线程在子线程结束前就已经退出,子线程会发生什么?
在一些论坛上看到许多人说子线程也会跟着退出,其实这是错误的,原因在于他们混淆了线程退出和进程退出概念。实际的答案是主线程退出后子线程的状态依赖于它所在的进程,如果进程没有退出的话子线程依然正常运转。如果进程退出了,那么它所有的线程都会退出,所以子线程也就退出了。
主线程先退出
先来看一个主线程先退出的例子:
#include <pthread.h> #include <unistd.h>
#include <stdio.h>
void* func(void* arg) { pthread_t main_tid = *static_cast<pthread_t*>(arg); pthread_cancel(main_tid); while (true) { } return NULL; }
int main(int argc, char* argv[]) { pthread_t main_tid = pthread_self(); pthread_t tid = 0; pthread_create(&tid, NULL, func, &main_tid); while (true) { printf("main loops\n"); } sleep(1); printf("main exit\n"); return 0; }
|
把主线程的线程号传给子线程,在子线程中通过pthread_cancel终止主线程使其退出。运行程序,可以发现在打印了一定数量的「main loops」之后程序就挂起了,但却没有退出。