C语言线程内printf无输出?添加换行才正常的原因咨询
为什么Linux下sleepSort线程中的printf无输出,加换行才显示?
我编写了一个简单的sleepsort算法C代码,在Linux控制台运行时,线程中的printf语句没有输出,直到输入字符后才显示;但给每个printf添加换行符后,程序就能正常工作,我无法理解其中原因。
代码如下:
#include <stdio.h> #include <time.h> #include <pthread.h> #define ARR_SIZE 10 void *sleepSort(void *arg) { usleep(1000 * *(int*) arg); printf("%d ", *(int*) arg); return NULL; } int main(void) { srand(time(NULL)); int arr[ARR_SIZE]; for (int i = 0; i < ARR_SIZE; i++) arr[i] = rand() % 100; pthread_t thr[ARR_SIZE]; for (int i = 0; i < ARR_SIZE; i++) pthread_create(thr + i, NULL, sleepSort, (void *)(arr + i)); getchar(); return 0; }
原因分析
这是Linux下标准输出(stdout)的行缓冲机制导致的:
- 默认情况下,
stdout采用行缓冲模式,只有满足以下条件之一时,才会把缓冲区里的内容刷新到控制台:- 输出内容包含换行符
\n - 缓冲区被填满(通常缓冲区大小为4KB或8KB)
- 程序正常终止(
main函数返回或调用exit)
- 输出内容包含换行符
- 你的代码中,
printf("%d ", ...)没有换行符,输出内容一直留在缓冲区里,未被刷新到屏幕。主线程停在getchar()等待输入时,程序还未终止,缓冲区不会自动刷新;直到你输入字符,getchar()返回,main函数结束,程序正常终止,缓冲区才会被一次性刷新,所以之前所有线程的输出会突然显示出来。 - 当你给
printf加上换行符后,每次输出都会触发行缓冲的刷新条件,内容会立刻显示到控制台。
解决方法
除了加换行符,还有两种常用方式可以解决这个问题:
- 手动刷新缓冲区:在
printf之后调用fflush(stdout),强制把缓冲区内容输出到控制台:printf("%d ", *(int*) arg); fflush(stdout); - 修改缓冲模式:在程序开头(比如
main函数第一行)修改stdout为无缓冲模式,这样每次printf都会直接输出:setvbuf(stdout, NULL, _IONBF, 0);
内容的提问来源于stack exchange,提问作者Kefest1
相关产品推荐
相关产品推荐

