Почему pthread_exit действует как pthread_join?

Код:

void *PrintHello(void *threadid)
{
   cout<<"Hello"<<endl;
   sleep(3);
   cout<<"Still PrintHello is alive"<<endl;
}
int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   cout<<"Calling thread:"<<t<<endl;
   pthread_create(&threads[0], NULL, PrintHello, NULL);
   //pthread_join(threads[0],NULL);
   cout<<"Main exits"<<endl;
   pthread_exit(NULL);
}

Зачем pthread_exit(NULL) здесь действует как pthread_join()? т.е. зачем выходить main не разрушая printHello нить и позволяя это продолжить?

2 ответа

Решение

pthread_exit() завершает только вызывающий поток. Поэтому, когда вы звоните из main(), он завершает основной поток, позволяя продолжить процесс. Это как и ожидалось.

Если вы позвоните exit() (или неявный выход из возврата) вместо этого он завершит весь процесс, и вы увидите printHello прекращено также.

Здесь есть довольно хороший ресурс, но процитирую ту часть, которая объясняет вашу проблему:

Обсуждение вызова pthread_exit () из main ():

  • Существует определенная проблема, если main () завершает работу перед потоками, которые он породил, если вы не вызываете pthread_exit () явно. Все созданные им потоки будут прерваны, потому что main () завершена и больше не существует для поддержки потоков.

  • Поскольку main () явно вызывает pthread_exit () как последнее, что он делает, main () будет блокироваться и поддерживаться живым, чтобы поддерживать созданные им потоки, пока они не будут выполнены.

Другие вопросы по тегам