C/C++中main函数终止后分离线程的行为及程序保活方案咨询
问题解答
1. main函数终止时程序会直接退出
当main函数执行到return 0时,整个进程会立刻终止,所有正在运行的子线程都会被强制终止,不管它们有没有执行完。这就是你移除sleep(1)后看不到全部输出的原因——main先退出了,很多线程还没来得及执行打印逻辑就被干掉了。
2. 线程分离为什么没用
pthread_detach的作用只是让线程结束后自动释放自身资源,不需要主线程调用pthread_join来回收,但它不会让主线程等待子线程完成。所以你加了分离操作,还是解决不了main提前退出的问题。
3. 正确让程序等所有线程结束的方法
用pthread_join函数,让主线程逐个等待每个子线程执行完毕后再退出。具体修改如下:
修改后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> using namespace std; #define threads 5 void *ThreadFunction(void *arg) { int n = *((int *)arg); printf("Hello World, %d \n", n ); return NULL; // 线程函数需返回void*类型值 } int main() { pthread_t *thread = new pthread_t[threads]; int *data = new int[threads]; for (int t = 0; t < threads; t++) { data[t] = t + 1; pthread_create(thread + t, NULL, ThreadFunction, (void *)(data + t)); } // 循环等待每个线程执行完成 for (int t = 0; t < threads; t++) { pthread_join(thread[t], NULL); } // new分配的内存用delete[]释放,避免和free混用 delete[] thread; delete[] data; return 0; }
关键说明
pthread_join(thread[t], NULL)会让主线程暂停,直到对应编号的子线程执行完毕才继续执行后续逻辑。- 这里可以去掉
pthread_detach,因为pthread_join本身就会完成线程资源的回收;如果一定要用线程分离,就得借助信号量等同步机制让主线程等待所有分离线程结束,但pthread_join是最简单直接的方案。 - 注意:C++中用
new分配的数组,要对应使用delete[]释放内存,free是C语言中配合malloc使用的,混用可能导致内存问题。
内容的提问来源于stack exchange,提问作者Z.Lun
相关产品推荐
相关产品推荐

