Программа вызывает printf (), а затем зацикливается навсегда. Почему я не вижу вывода printf?

#c #linux #multithreading #while-loop #printing

Вопрос:

 #include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;unistd.hgt; #include lt;pthread.hgt; #include lt;math.hgt;   struct my_Struct{  int a;  int b; }; void *myThreadFun(void *received_struct) {  struct my_Struct *struct_ptr = (struct my_Struct*) received_struct;  printf("%.1lf",pow(struct_ptr-gt;a,struct_ptr-gt;b));  return NULL; }   int main(int argc, char* argv[]) {  struct my_Struct s;  s.a = atoi(argv[1]);  s.b = atoi(argv[2]);    pthread_t thread_id;  pthread_create(amp;thread_id, NULL, myThreadFun, amp;s);  pthread_join(thread_id, NULL);  while(1);  exit(0); }  

Почему этот код ничего не делает? Предполагается, что он напечатает инструкцию в порожденном потоке, а затем перейдет в бесконечный цикл.

Комментарии:

1. Добро пожаловать в SO. Я предполагаю, что ваше предположение неверно, и вы просто не видите результата. Печать в stdout обычно выполняется с буферизацией строк. Это означает, что вам нужно либо поставить a n в конце вывода, либо использовать fflush(stdout) .

2. Если бы вы завершили printf новой строкой, ваш выходной буфер был бы отображен.

3. Спасибо, и то, и другое решает проблему.

4. Я изменил название вашего вопроса, чтобы другие люди, у которых есть аналогичная проблема, могли с большей вероятностью ее найти.

Ответ №1:

Используя gdb, мы можем видеть, что поток успешно разветвлен

 [New Thread 0x7ffff7a2d640 (LWP 8261)] [Switching to Thread 0x7ffff7a2d640 (LWP 8261)]  Thread 2 "a.out" hit Breakpoint 1, myThreadFun (received_struct=0x7fffffffd960) at tmp.cpp:15  

Если вы удалите while(1) его, вы сможете найти вывод. Задержка вывода может быть связана с буфером stdio, что не while(1) позволило сбросить буфер.

Вы можете попробовать другой подход: добавьте fflush(stdout); после printf , это работает так же.

Ответ №2:

Это потому stdout , что буферизует целые строки, поэтому это означает, что он не будет печатать ваши значения, пока вы не сделаете одну из трех вещей:

  • закончите свою строку с n : printf("%.1lfn", ...)
  • очистите буфер stdio: fflush(stdout)
  • завершите программу (она автоматически очистит все буферы)