#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
обычно выполняется с буферизацией строк. Это означает, что вам нужно либо поставить an
в конце вывода, либо использовать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)
- завершите программу (она автоматически очистит все буферы)