p t h r e a d _ j o i n pthread\_join pthread_join函数简介

p t h r e a d _ j o i n pthread\_join pthread_join函数可以用于等待一个指定线程的结束,并且收集该线程的返回值(如果有返回值的话)。


下面是 p t h r e a d _ j o i n pthread\_join pthread_join函数的语法:

int pthread_join(pthread_t thread, void **retval);

1. t h r e a d 1.thread 1.thread:要等待结束的线程的标识符。
2. r e t v a l 2.retval 2.retval:用于存储线程返回值的指针。如果该线程没有返回值,则该参数可以设置为 N U L L NULL NULL
调用 p t h r e a d _ j o i n pthread\_join pthread_join函数会阻塞当前线程,直到指定的线程结束为止。


p t h r e a d _ j o i n pthread\_join pthread_join函数特点

p h t r e a d _ j o i n phtread\_join phtread_join函数的第2个参数为 v o i d ∗ ∗ void** void ,为二重指针,接收的是线程函数中 p t h r e a d _ e x i t ( v o i d ∗ a r g ) ; pthread\_exit(void* arg); pthread_exit(voidarg);的参数 或者 或者 或者 r e t u r n return return 的值,可以用来查看 p t h r e a d _ e x i t pthread\_exit pthread_exit传递的参数(如果不关心退出状态, p h t r e a d _ j o i n phtread\_join phtread_join的这个参数可以置空,即 p h t r e a d _ j o i n ( t i d , N U L L ) phtread\_join(tid,NULL) phtread_join(tid,NULL)。
p t h r e a d _ j o i n pthread\_join pthread_join函数在线程退出时,用来清理线程资源。
p h t r e a d _ j o i n phtread\_join phtread_join函数会阻塞调用方,直至 p t h r e a d _ j o i n pthread\_join pthread_join所指的线程退出。


下面是一个使用 p t h r e a d _ j o i n pthread\_join pthread_join函数的例子:

代码

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *my_thread_func(void *arg) {
    int i;
    int sum = 0;
    for (i = 1; i <= (int)arg; i++) {
        sum += i;
    }
    return (void *)sum;
}

int main() {
    pthread_t tid;
    int n = 5;
    if (pthread_create(&tid, NULL, my_thread_func, (void *)n) != 0) {
        printf("Error creating thread\n");
        return -1;
    }
    void *ret_val;
    if (pthread_join(tid, &ret_val) != 0) {
        printf("Error joining thread\n");
        return -1;
    }
    printf("Sum of %d numbers is %ld\n", n, (long)ret_val);
    return 0;
}

在这里插入图片描述

运行

在这里插入图片描述

解释

1.第一行:#include <pthread.h>。导入 pthread 库头文件。
2.第二行:#include <stdio.h>。导入标准输入输出库头文件。
3.第三行:#include <stdlib.h>。导入标准C 库的库文件。
4.第五行:void *my_thread_func(void *arg) {}。定义一个线程函数 my_thread_func,其参数类型为 void 指针,并返回一个指针。
5.第六行:int i;。定义一个整型变量 i,用于循环计算从1到n的和。
6.第七行:int sum = 0;。定义一个整型变量 sum,用于累加计算结果。
7.第八行:for (i = 1; i <= (int)arg; i++) {}。使用循环计算从1到n的和。
8.第九行:sum += i;。将每个数值累加到 sum 变量中。
9.第十一行:return (void *)sum;。返回计算结果,注意要将整型变量 sum 转换为 void 指针类型。
10.第十四行:定义 main 函数。
11.第十五行:pthread_t tid;。定义 pthread_t 类型的变量 tid,用于存储线程 ID。
12.第十六行:int n = 5;。定义一个整型变量 n,表示从1到n的整数之和。
13.第十七行:if (pthread_create(&tid, NULL, my_thread_func, (void *)n) != 0) {}。创建新线程并执行相应的函数,并将线程 ID 存储到 tid 中。如果创建线程失败,则打印错误信息并返回-1。
14第二十一行:void *ret_val;。定义一个 void 指针 ret_val,用于存储线程返回值
15.第二十二行:if (pthread_join(tid, &ret_val) != 0) {}。调用 pthread_join 函数等待指定线程结束,并获取其返回值。如果等待线程结束失败,则打印错误信息并返回-1。
16.第二十六行:printf(“Sum of %d numbers is %ld\n”, n, (long)ret_val);。打印从1到n的整数之和。
17.第二十七行:return 0;。返回程序正常执行结束的代码。

Logo

更多推荐