【问题标题】:Thread does not give output unless an explicit fflush function is invoked when using output redirection除非在使用输出重定向时调用显式 fflush 函数,否则线程不会给出输出
【发布时间】:2015-11-11 07:25:17
【问题描述】:

我正在编写一个多线程程序。程序结构如下所示

int main()
{

    printf("To Call threads\n");
    thread1=pthread_create(&trd1,NULL,process1,(void *)sleepTimeForP1);
    thread2=pthread_create(&trd2,NULL,process2,(void *)sleepTimeForP2);
    pthread_join(trd1, NULL);
    pthread_join(trd2, NULL);
    return 0;
}

线程的代码是

void *process1 (void *sleepTimeForP1)
{
    int *tsleepTimeForP1 = (int *)sleepTimeForP1;
    while(1)
    {
        pthread_mutex_lock(&lock);
        printf("inside thread\n");
        pthread_mutex_unlock(&lock);
        sleep(1);
    }

}

代码工作正常,并在未完成输出重定向时打印输出。但是当给出输出重定向时,文件中没有输出。现在,如果我在每个printf() 语句之后给出明确的fflush(stdout),我将得到所需的输出。为什么我需要给出明确的 fflush() ?

【问题讨论】:

    标签: c linux multithreading unix io-redirection


    【解决方案1】:

    来自 C99 §7.19.3[7]:

    最初打开时,标准错误流没有完全缓冲;标准输入和标准输出流被完全缓冲当且仅当流可以被确定为不引用交互式设备

    “完全缓冲”(与“行缓冲”相比):C99 §7.19.3[3]

    当一个流被完全缓冲时,当缓冲区被填满时,字符将作为一个块传输到主机环境或从主机环境传输。如果流是行缓冲的,则当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。

    因此,当标准输出是交互式的(例如 shell)时,它是行缓冲的。但是当你将它重定向到一个文件时,它会被完全缓冲,你必须使用fflush

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多