Linux多线程04-连接已终止的线程

pthread_join

描述:

pthread_join() 函数等待由 thread 指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。

如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的位置。如果目标线程被取消,则PTHREAD_CANCELED将放置在retval中。

如果多个线程同时尝试加入同一个线程,则结果是未定义的。如果调用pthread_join()的线程被取消,则目标线程将保持可连接状态(即它将不会被分离)。

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
    功能: 和一个已经终止的线程进行连接, 进行资源回收
        子线程不一定需要通过主线程来回收, 任何一个线程都可以回收其他已经终止的线程
        这个函数是阻塞函数, 调用一次只能回收一个子线程
        (一般在主线程中去使用)
    参数:
        - thread: 需要回收的子线程ID
        - retval: 二级指针, 接收子线程退出时的返回值(pthread_exit(void *retval)中的retval)
    返回:
        - 成功 0
        - 失败 非0错误号

Compile and link with -pthread.

代码实例

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

int value = 10;

void* callback(void* arg) 
{
    printf("child thread id: %ld\n",pthread_self());
    sleep(3);
    // return NULL; 
    
    pthread_exit((void*)&value);
}

int main(){
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, callback, NULL);

    if(ret != 0)
    {
        char* errstr = strerror(ret);
        printf("error: %s\n", errstr);
    }

    //主线程
    int i = 0;
    for(;i<5;i++){
        printf("%d\n",i);
    }

    printf("tid: %ld, main thread id: %ld\n", tid, pthread_self());

    //主线程调用pthread_join回收子线程资源
    int* thread_retval;
    ret = pthread_join(tid, (void**)&thread_retval);
    if(ret != 0)
    {
        char* errstr = strerror(ret);
        printf("error: %s\n", errstr);
    }
    printf("exit data: %d\n", *thread_retval);//10
    printf("回收子线程资源成功!\n"); //阻塞了3S

    pthread_exit(NULL);
    
    return 0;
}

运行结果

0
1
2
3
4
tid: 139739205437184, main thread id: 139739213825856
child thread id: 139739205437184
exit data: 10
回收子线程资源成功!
posted @ 2023-06-26 08:53  言叶以上  阅读(21)  评论(0编辑  收藏  举报