You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:20:16