#c #multithreading #gcc
#c #многопоточность #gcc
Вопрос:
Я компилирую свой код с помощью gcc test.c -o test.o -lpthread -lrt
когда я запускаю test.o
, ничего не выводится на консоль. Я прочитал справочные страницы и думаю, что мой код должен успешно создать новый поток. Есть ли какая-либо причина, по которой созданный поток не может печатать на консоли?
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
void* thd ();
pthread_t tid;
int main()
{
int i;
i = pthread_create(amp;tid, NULL, amp;thd, NULL);
}
void* thd ()
{
printf("hello");
}
Комментарии:
1. 1)
void* thd ();
является недопустимым прототипом. Используйтеvoid *thd(void);
2) Для определения, такие деклараторы не рекомендуются. Здесь также используйте стиль прототипа.2. Не забудьте напечатать новую строку. Возможно, было бы неплохо дождаться завершения потоков…
3.
pthread_join
необходимо вызвать изmain
, чтобы дождаться завершения потока. В противном случае основной поток может завершиться, в результате чего все дочерние потоки будут уничтожены до завершения (или даже запуска) дочернего потока.
Ответ №1:
Он не будет печатать, потому что вы завершите печать до печати (без join вы не будете ждать завершения потока)
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
void* thd(void *);
pthread_t tid;
int main()
{
int i;
i = pthread_create(amp;tid, NULL, amp;thd, NULL);
pthread_join(tid, NULL);
return 0;
}
void* thd(void *unused)
{
printf("hellon");
return 0;
}
Ответ №2:
Ваша программа создает поток, а затем завершает работу, не давая потоку возможности выполнить какую-либо полезную работу. Нет причин ожидать, что он что-либо напечатает.
Комментарии:
1. Поэтому я должен дождаться завершения потока. Я вижу, что я мог бы использовать
pthread_join
для этого, это то, для чего это предназначено?2. @MaxwellPowell Только потому, что это завершение процесса, это разумный способ сделать это. Процесс не должен завершаться, пока не завершит очистку всех созданных им потоков. Обычно злоупотребляют ожиданием завершения работы, и это (по крайней мере, IMO) ошибка.
Ответ №3:
Как и сказал Дэвид Шварц, основной поток должен дождаться завершения дочернего потока. Используйте pthread_join внутри main(), чтобы сделать это, вот так:
#include <sys/types.h>
void *thd(void *);
pthread_t tid;
int main()
{
int i;
i = pthread_create(amp;tid, NULL, amp;thd, NULL);
pthread_join(tid, NULL);
return 0;
}
void *thd(void *unused)
{
printf("hellon");
return 0;
}