线程函数仅调用一次却重复打印的原因排查
线程创建后偶现重复打印的问题分析
问题核心原因
你的代码存在两个关键问题,共同导致了偶现的重复打印现象:
线程函数未正确返回值
你定义的PrintMessage1和PrintMessage2线程函数声明为返回void*类型,但函数末尾没有任何return语句。在C语言中,这种情况属于未定义行为——线程执行完函数最后一行后,栈帧的恢复逻辑会出现异常,可能导致线程的执行流被错误引导,甚至重复执行整个函数体,这就是你看到两次message from thread1的直接原因。主线程未等待子线程完成
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
相关产品推荐
相关产品推荐

