友链
pthread_join
是一个阻塞函数,接受两个参数,一个是线程id,另一个是存储返回指的双重指针
pthread_join
函数会一直阻塞直到线程id对应的线程结束,用法如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void *worker_1(void *arg)
{
int i = 0;
while (i < 4)
{
sleep(1);
i++;
}
return NULL;
}
void *worker_2(void *arg)
{
int i = 0;
while (i < 2)
{
sleep(1);
i++;
}
pthread_exit(arg);
return NULL;
}
void *worker_3(void *arg)
{
int i = 0;
while (i < 2)
{
sleep(1);
i++;
}
return NULL;
}
int main()
{
pthread_t tid1, tid2, tid3;
pthread_attr_t thread_attr_1;
pthread_attr_init(&thread_attr_1);
pthread_attr_t thread_attr_2;
pthread_attr_init(&thread_attr_2);
pthread_attr_t thread_attr_3;
pthread_attr_init(&thread_attr_3);
int exit_status;
pthread_create(&tid1, &thread_attr_1, worker_1, NULL);
pthread_create(&tid2, &thread_attr_2, worker_2, &exit_status);
pthread_create(&tid3, &thread_attr_3, worker_3, NULL);
// 回收子线程的资源,阻塞
int detachstate;
pthread_attr_getdetachstate(&thread_attr_1, &detachstate);
pthread_attr_destroy(&thread_attr_1);
int* error_num;
if (PTHREAD_CREATE_JOINABLE == detachstate)
{
printf("tdi_1 is still joinable\n");
pthread_join(tid1, (void *)&error_num);
if (NULL != error_num)
printf("tid_1 join return value: %d\n", *error_num);
}
printf("%d thread is exited\n", tid1);
pthread_attr_getdetachstate(&thread_attr_2, &detachstate);
pthread_attr_destroy(&thread_attr_2);
if (PTHREAD_CREATE_JOINABLE == detachstate)
{
printf("tdi_2 is still joinable\n");
pthread_join(tid2, (void *)&error_num);
if (NULL != error_num)
printf("tid_2 join return value: %d\n", *error_num);
}
printf("%d thread is exited\n", tid2);
pthread_attr_getdetachstate(&thread_attr_3, &detachstate);
pthread_attr_destroy(&thread_attr_3);
if (PTHREAD_CREATE_JOINABLE == detachstate)
{
printf("tdi_3 is still joinable\n");
pthread_join(tid3, (void *)&error_num);
if (NULL != error_num)
printf("tid_3 join return value: %d\n", *error_num);
}
printf("%d thread is exited\n", tid3);
}
可以看到,我们在线程回调函数中,调用pthread_exit
,将arg
作为参数传入,最后在thread_join
函数中我们可以获取到线程的退出状态
你可能会问为什么要用pthread_join
函数,直接使用pthread_detach
把线程分离掉不好吗,还不会阻塞
在上面这个例子中我们是看不出来效果的,但是如果你想在主线程中在子线程结束之后执行操作,就必须要执行pthread_join
了,因为pthread_join
会一直阻塞,直到该线程结束,这样你就可以确保你是在某个线程结束后执行操作,具体的案例,我还没有碰到,如果后面碰到了,我会回来更新