c - 无法在线程内用 C 打印?

标签 c multithreading printf

我创建了一个简单的 sleep 排序算法:

#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 控制台运行它时,在输入新字符之前不会打印任何内容。然而,修改我的程序以在每个 printf 上添加换行符后,它按预期工作,我不明白为什么。

最佳答案

默认情况下,stdout 在连接到终端时是行缓冲的。仅当收到换行符、缓冲区已满、手动刷新句柄或禁用缓冲时,才会对系统进行写入。在此之前,输出只是累积在缓冲区中。

所以你需要

  • 发送换行符,

    printf( "%d\n", ... );
    
  • 手动刷新stdout

    printf( "%d ", ... );
    fflush( stdout );
    
  • 或禁用stdout的缓冲。

    setbuf( stdout, NULL );
      //or//
    setvbuf( stdout, NULL, _IONBF, 0 );
    

默认情况下,当连接到终端以外的其他设备时,stdout 是完全缓冲的。这也是其他句柄的默认设置,无论它们是否连接到终端。这与行缓冲相同,只是换行不会导致刷新。

关于c - 无法在线程内用 C 打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76941191/

相关文章:

c - ListView 滚动条闪烁

c - 为所有可能的 4 位消息打印 Hamming (7,4) 代码

c - 如何在 Windows 上用 C 语言将这种阻塞 I/O 模式转换为重叠 I/O 模式?

c# - 如何运行多个线程并等待完成所有线程

c++ - 解锁保护(或 boost::reverse_lock)是反模式吗?为什么?

c - 扫描相似的数字并将它们放在不同的数组中

c - a[ ][3] 此数组中已创建了多少行?

c - printf() 在 x86-64 平台上给出相同的输出,即使在交换参数时也是如此

c - C中的输入输出

我可以在 C 中的格式字符串中使用嵌套格式字符吗?