除非在使用输出重定向时调用显式fflush函数,否则线程不提供输出

Amr*_*hna 0 c unix linux multithreading io-redirection

我正在编写一个多线程程序.该计划的结构如下

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;
}
Run Code Online (Sandbox Code Playgroud)

线程的代码是

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

}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,并在没有输出重定向时打印输出.但是,当给出输出重定向时,文件中不会获得输出.现在,如果我fflush(stdout)在每个printf()语句后都明确说明,那么我得到了所需的输出.为什么我需要给出明确的fflush()?

Kni*_*nug 5

从C99§7.19.3[7]:

最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.

'全缓冲'(vs'线缓冲'):C99§7.19.3[3]

当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输.当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输.

因此,当标准输出是交互式的(例如shell)时,它是行缓冲的.但是,当您将其重定向到文件时,它将变为完全缓冲,您必须使用fflush.