Хорошо использовать pthread_exit в main.Когда используется pthread_exit, основной поток прекращает выполнение и будет оставаться в состоянии зомби (перестал существовать) до тех пор, пока все другие потоки не завершатся.
Если вы используете pthread_exit в главном потоке, не можете получить статус возврата других потоков и не можете выполнить очистку для других потоков (это можно сделать с помощью pthread_join (3)).Кроме того, лучше отсоединять потоки (pthread_detach (3)), чтобы ресурсы потока автоматически высвобождались при завершении потока.Совместно используемые ресурсы не будут освобождены до тех пор, пока не завершатся все потоки.
Можно использовать, когда ресурсы не выделяются в основном потоке, очистка не требуется.Ниже код показывает использование pthread_exit в основном потоке.Второй printf в main не печатается при выходе из основного потока после вызова pthread_exit.Вывод Ps показывает несуществующий основной поток.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
void *functionC(void *);
int main()
{
int rc;
pthread_t th;
if(rc = pthread_create(&th, NULL, &functionC, NULL))
{
printf("Thread creation failed, return code %d, errno %d", rc, errno);
}
printf("Main thread %lu: Sleeping for 20 seconds\n", pthread_self());
fflush(stdout);
sleep(20);
pthread_exit(NULL);
printf("Main thread %lu: This will not be printed as we already called pthread_exit\n", pthread_self());
exit(0);
}
void *functionC(void *)
{
printf("Thread %lu: Sleeping for 20 second\n", pthread_self());
sleep(20);
printf("Thread %lu: Came out of first and sleeping again\n", pthread_self());
sleep(20);
printf("CThread %lu: Came out of second sleep\n", pthread_self());
}
Вывод вышеуказанного кода:
Main thread 140166909204288: Sleeping for 20 seconds
Thread 140166900684544: Sleeping for 20 second
Thread 140166900684544: Came out of first and sleeping again
CThread 140166900684544: Came out of second sleep
ps
вывод:
root@xxxx-VirtualBox:~/pthread_tst# ps -elfT |grep a.out
0 S root 9530 9530 9496 0 80 0 - 3722 hrtime 17:31 pts/1 00:00:00 ./a.out
1 S root 9530 9531 9496 0 80 0 - 3722 hrtime 17:31 pts/1 00:00:00 ./a.out
0 S root 9537 9537 2182 0 80 0 - 5384 pipe_w 17:31 pts/0 00:00:00 grep --color=auto a.out
root@xxxx-VirtualBox:~/pthread_tst# ps -elfT |grep a.out
0 Z root 9530 9530 9496 0 80 0 - 0 - 17:31 pts/1 00:00:00 [a.out] <defunct>
1 S root 9530 9531 9496 0 80 0 - 4258 hrtime 17:31 pts/1 00:00:00 ./a.out
0 S root 9539 9539 2182 0 80 0 - 5384 pipe_w 17:31 pts/0 00:00:00 grep --color=auto a.out`
Пожалуйста, проверьте блог Tech Easy для получения дополнительной информации о потоках.