gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:51:34 26 4
gpt4 key购买 nike

我创建了一个简单的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com