Код:
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
нить и позволяя это продолжить?
pthread_exit()
завершает только вызывающий поток. Поэтому, когда вы звоните из main()
, он завершает основной поток, позволяя продолжить процесс. Это как и ожидалось.
Если вы позвоните exit()
(или неявный выход из возврата) вместо этого он завершит весь процесс, и вы увидите printHello
прекращено также.
Там довольно хороший ресурс Вот но процитирую ту часть, которая объясняет вашу проблему:
Обсуждение вызова pthread_exit () из main ():
Существует определенная проблема, если main () завершает работу перед потоками, которые он породил, если вы не вызываете pthread_exit () явно. Все созданные им потоки будут прерваны, потому что main () завершена и больше не существует для поддержки потоков.
Поскольку main () явно вызывает pthread_exit () как последнее, что он делает, main () будет блокироваться и оставаться в живых, чтобы поддерживать созданные им потоки, пока они не будут выполнены.