Сбой при создании потоков с помощью pthread

#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;
}