首页 > 系统相关 >Linux多线程04-连接已终止的线程

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

时间:2023-06-26 09:01:31浏览次数:46  
标签:include join 04 thread 线程 pthread 多线程 retval

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
回收子线程资源成功!

标签:include,join,04,thread,线程,pthread,多线程,retval
From: https://www.cnblogs.com/anqwjoe/p/17504442.html

相关文章

  • Linux多线程03-终止线程
    pthread_exit和pthread_self和pthread_equal描述:pthread_exitpthread_exit()函数终止调用该函数的线程,并通过retval返回一个值,如果该线程是可连接的,则在同一进程中调用pthread_join(3)的另一个线程可以获取该值。任何由pthread_cleanup_push(3)建立但尚未弹出的清理处......
  • Linux多线程07-线程属性
    线程属性类型:pthread_attr_t描述:pthread_attr_setdetachstate()函数将由attr引用的线程属性对象的分离状态属性设置为detachstate中指定的值。分离状态属性确定使用线程属性对象attr创建的线程将在可连接状态还是分离状态下创建。可以在detachstate中指定以下值:P......
  • Linux多线程06-线程取消
    pthread_cancel描述:pthread_cancel()函数向线程thread发送一个取消请求。目标线程对取消请求的响应取决于该线程控制的两个属性:其取消状态和类型。一个线程的取消状态由pthread_setcancelstate(3)确定,可以启用(对于新线程而言是默认的)或禁用。如果一个线程已禁用取消,则取消请......
  • Linux多线程05-线程的分离
    pthread_detach描述:pthread_detach()函数将由thread标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与已终止的线程加入。尝试分离一个已经分离的线程会导致未指定的行为。#include<pthread.h>intpthread_detach(pthread_tt......
  • Linux多线程08-线程同步
    一个多线程售票示例://三个窗口,共100张票#include<stdio.h>#include<pthread.h>#include<unistd.h>inttickets=100;//所有线程都共享这100张票void*sellticket(void*arg){//卖票while(tickets>0){usleep(6000);//间隔6000微秒p......
  • 04 | 05 深入浅出索引
    04|05深入浅出索引在MySQL中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。索引常见模型模型特点场景使用哈希表键值存储数据等值查询Memcach......
  • 异步注解@Async使用自定义线程池
    1.@Async注解@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。该注解的代码为:可以看出其是作用在类和方法上,能够在运行时被获取到。当在使用@Async时,如果不指......
  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • 油烟机语音方案:NV040D语音芯片,支持MCU输入UART指令
    随着人们生活水平的提高和厨房使用频率的增加,油烟机成为现代家庭生活中必不可少的一种家用电器,而语音智能化技术的发展也使得油烟机功能更加智能化。九芯电子的NV040D语音芯片是一种具备MCU输入UART指令功能的专业语音芯片,可以广泛应用于油烟机的语音控制领域。本文将介绍NV040D语......
  • 油烟机语音方案:NV040D语音芯片,支持MCU输入UART指令
    随着人们生活水平的提高和厨房使用频率的增加,油烟机成为现代家庭生活中必不可少的一种家用电器,而语音智能化技术的发展也使得油烟机功能更加智能化。九芯电子的NV040D语音芯片是一种具备MCU输入UART指令功能的专业语音芯片,可以广泛应用于油烟机的语音控制领域。本文将介绍NV040D语......