2016-07-12 2 views
0

Я практикую резьбовое программирование и нашел это. Когда I 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

Возможный дубликат 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

Смежные вопросы