C语言多线程代码调用printf后死循环无输出是什么原因?
问题原因分析
核心原因:标准输出缓冲区未刷新
C语言中标准输出流stdout默认使用行缓冲模式,只有满足以下任意条件时,缓冲区的内容才会输出到终端:
- 缓冲区被数据填满
- 输出内容中包含换行符
\n - 程序正常退出,或手动调用
fflush(stdout)强制刷新
你提供的代码里printf("%.1lf",pow(struct_ptr->a,struct_ptr->b));没有添加换行符,计算结果暂时存在输出缓冲区中,后续主线程进入了无限死循环,程序永远不会正常退出,也没有触发缓冲区刷新的逻辑,因此看不到任何打印内容。
其他可能原因:编译时未正确链接依赖库
代码使用了POSIX线程库和数学库,编译时需要显式链接对应的库:
- 线程库需要加编译参数
-pthread - 数学库需要加编译参数
-lm
如果编译时没有添加上述参数,要么会编译失败,要么运行时会出现异常无输出。
修复方案
- 修改printf语句,添加换行符触发自动刷新:
printf("%.1lf\n",pow(struct_ptr->a,struct_ptr->b));
- 或者在printf之后手动刷新缓冲区:
printf("%.1lf",pow(struct_ptr->a,struct_ptr->b)); fflush(stdout);
- 编译时添加依赖库参数,示例gcc编译命令:
gcc 源码文件名.c -o 可执行文件名 -pthread -lm
内容的提问来源于stack exchange,提问作者Labeeb
相关产品推荐
相关产品推荐

