我正在编写一个多线程程序。该计划的结构如下所示
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);
}
}
代码工作正常,并在没有完成输出重定向时打印输出。但是,当给出输出重定向时,文件中不会获得输出。现在如果我在每个fflush(stdout)
语句之后给出明确的printf()
,我就会获得所需的输出。为什么我需要提供明确的fflush()?
答案 0 :(得分:5)
来自C99§7.19.3[7]:
最初打开时,标准错误流未完全缓冲;标准输入和标准输出流是完全缓冲的,当且仅当流可以确定不参考交互设备时。
'全缓冲'(vs'线缓冲'):C99§7.19.3[3]
当流被完全缓冲时,当填充缓冲区时,字符将作为块传输到主机环境或从主机环境传输。当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。
因此,当标准输出是交互式的(例如shell)时,它是行缓冲的。但是当您将其重定向到文件时,它将完全缓冲,您必须使用fflush
。