2016-07-12 66 views
0

我正在練習線程編程,並發現這一點。當我printf("1"),輸出將在幾秒鐘後出現,但當我printf("\n"),輸出一步一步。爲什麼?爲什麼這些printfs的行爲不同?

#include<stdio.h> 
#include<pthread.h> 
#include<errno.h> 
#include<stdlib.h> 



void * __th_handle(void *); 

int run_now=0;  // globle var 

int main() 
{ 
    char message[]={"going in thread"}; 
    void * th_result; 
    int ret,c=0; 
    pthread_t __th; 


// printf("in main thread\n"); 

    if(pthread_create(&__th,NULL,(void *)__th_handle,(void *)message)==-1) 
     { 
     perror("pthread_creat fails "); 
     exit(0); 
     } 

    while(c++<20) 
    { 
     if(run_now==0) 
      { 
      printf("1"); //printf("1\n"); 
      run_now=1; 
      } 
     else 
      {sleep(1);} 
    } 


    pthread_join(__th,&th_result); 
    if(ret!=0) 
    { 
    perror("join fails"); 
    exit(0); 
    } 
    printf("th_result from __th thread : %s\n",(char *)th_result); 

return 0; 
} 

void * __th_handle(void *argv) 
{ 
// printf("message : %s",(char *)(argv)); 
    int c1=0; 
    while(c1++<20) 
    { 
     if(run_now==1) 
      { 
      printf("2"); //printf("2\n"); 
      run_now=0; 
      } 
     else 
      {sleep(1);} 
    } 


    sleep(2); 
    pthread_exit("_th thread terminated"); 

} 
+1

可能duplacte的http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin – hyde

回答

1

默認情況下,stdout的輸出爲行緩衝。

如果添加換行符,則每個printf()都將導致自己的輸出。

如果不添加換行符,輸出將被累計,直到看到換行符或程序結束。這通常會導致單個輸出。

+0

謝謝你是對的! –

1

FILE*有不同的緩衝模式。典型地,標準輸出行緩衝,這意味着當有一個新行,或者如果顯式調用fflush(stdout)

有3種緩衝器模式時輸出時,纔會打印:

  • 無緩衝
  • 行緩衝
  • 全緩衝

你可以閱讀更多關於如何在不同的緩衝工作以及如何去改變它here