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

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采用行缓冲模式,只有满足以下条件之一时,才会把缓冲区里的内容刷新到控制台:
    1. 输出内容包含换行符\n
    2. 缓冲区被填满(通常缓冲区大小为4KB或8KB)
    3. 程序正常终止(main函数返回或调用exit)
  • 你的代码中,printf("%d ", ...)没有换行符,输出内容一直留在缓冲区里,未被刷新到屏幕。主线程停在getchar()等待输入时,程序还未终止,缓冲区不会自动刷新;直到你输入字符,getchar()返回,main函数结束,程序正常终止,缓冲区才会被一次性刷新,所以之前所有线程的输出会突然显示出来。
  • 当你给printf加上换行符后,每次输出都会触发行缓冲的刷新条件,内容会立刻显示到控制台。

解决方法

除了加换行符,还有两种常用方式可以解决这个问题:

  1. 手动刷新缓冲区:在printf之后调用fflush(stdout),强制把缓冲区内容输出到控制台:
    printf("%d ", *(int*) arg);
    fflush(stdout);
    
  2. 修改缓冲模式:在程序开头(比如main函数第一行)修改stdout为无缓冲模式,这样每次printf都会直接输出:
    setvbuf(stdout, NULL, _IONBF, 0);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:23:16