在 main 中使用 pthread_exit 很好。当使用 pthread_exit 时,主线程将停止执行并保持僵尸(已失效)状态,直到所有其他线程退出。
如果您在主线程中使用 pthread_exit,则无法获取其他线程的返回状态并且无法对其他线程进行清理(可以使用 pthread_join(3) 完成)。此外,最好分离线程(pthread_detach(3)),以便在线程终止时自动释放线程资源。在所有线程退出之前,共享资源不会被释放。
在主线程不分配资源时可以使用,不需要清理。下面的代码显示了在主线程中使用 pthread_exit。main 中的第二个 printf 不会打印,因为调用 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。