linux之pthread_join函数
linux之pthread_join函数
- pthread_joinpthread\\_joinpthread_join函数简介
- pthread_joinpthread\\_joinpthread_join函数特点
- 下面是一个使用pthread_joinpthread\\_joinpthread_join函数的例子:
-
- 代码
- 运行
- 解释
pthread_joinpthread\\_joinpthread_join函数简介
pthread_joinpthread\\_joinpthread_join函数可以用于等待一个指定线程的结束,并且收集该线程的返回值(如果有返回值的话)。
下面是pthread_joinpthread\\_joinpthread_join函数的语法:
int pthread_join(pthread_t thread, void **retval);
1.thread1.thread1.thread:要等待结束的线程的标识符。
2.retval2.retval2.retval:用于存储线程返回值的指针。如果该线程没有返回值,则该参数可以设置为NULLNULLNULL。
调用pthread_joinpthread\\_joinpthread_join函数会阻塞当前线程,直到指定的线程结束为止。
pthread_joinpthread\\_joinpthread_join函数特点
phtread_joinphtread\\_joinphtread_join函数的第2个参数为void∗∗voidvoid∗∗ ,为二重指针,接收的是线程函数中pthread_exit(void∗arg);pthread\\_exit(void* arg);pthread_exit(void∗arg);的参数或者或者或者是returnreturnreturn 的值,可以用来查看pthread_exitpthread\\_exitpthread_exit传递的参数(如果不关心退出状态,phtread_joinphtread\\_joinphtread_join的这个参数可以置空,即phtread_join(tid,NULL)phtread\\_join(tid,NULL)phtread_join(tid,NULL))。
pthread_joinpthread\\_joinpthread_join函数在线程退出时,用来清理线程资源。
phtread_joinphtread\\_joinphtread_join函数会阻塞调用方,直至pthread_joinpthread\\_joinpthread_join所指的线程退出。
下面是一个使用pthread_joinpthread\\_joinpthread_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;。返回程序正常执行结束的代码。