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

线程函数仅调用一次却重复打印的原因排查

线程创建后偶现重复打印的问题分析

问题核心原因

你的代码存在两个关键问题,共同导致了偶现的重复打印现象:

  1. 线程函数未正确返回值
    你定义的PrintMessage1和PrintMessage2线程函数声明为返回void*类型,但函数末尾没有任何return语句。在C语言中,这种情况属于未定义行为——线程执行完函数最后一行后,栈帧的恢复逻辑会出现异常,可能导致线程的执行流被错误引导,甚至重复执行整个函数体,这就是你看到两次message from thread1的直接原因。

  2. 主线程未等待子线程完成
    main函数在创建两个线程后,直接打印消息就退出了。主线程退出会触发整个进程终止,操作系统会强制终止所有未执行完成的子线程。但进程终止的时机是不确定的,结合线程函数的未定义行为,就会出现各种异常输出(比如你遇到的重复打印,或者完全看不到某个线程的输出)。

修复方案

1. 给线程函数添加正确的返回语句

每个线程函数必须返回一个合法的void*类型值,通常用return NULL;即可:

void *PrintMessage1()
{
    printf("message from thread1\n");
    return NULL;
}

void *PrintMessage2()
{
    printf("this is thread2\n");
    return NULL;
}

2. 主线程等待子线程执行完毕

在main函数中调用pthread_join,等待两个子线程全部执行完成后再退出:

int main()
{
    pthread_t Thread1, Thread2;
    int ret;

    ret = pthread_create(&Thread1, NULL, PrintMessage1, NULL);
    if (ret) {printf("Thread1 creation error\n"); exit(1);}

    ret = pthread_create(&Thread2, NULL, PrintMessage2, NULL);
    if (ret) {printf("Thread2 creation error\n"); exit(2);}

    // 阻塞等待两个线程执行完成
    pthread_join(Thread1, NULL);
    pthread_join(Thread2, NULL);

    printf("this is main\n");
}

编译注意事项

编译时需要链接pthread库,使用以下命令:

cc your_code.c -o your_program -lpthread

内容的提问来源于stack exchange,提问作者lundq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:45:20