900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux 回收子线程 和取消(杀死)线程

linux 回收子线程 和取消(杀死)线程

时间:2022-07-07 03:13:46

相关推荐

linux 回收子线程 和取消(杀死)线程

目录

一 回顾二 回收子线程三 在栈区定义回收子线程的变量四 在堆区定义回收子线程的变量五 取消(杀死)线程

一 回顾

用了 exit(0);进程退出方式和 pthtread_exit(NULL);的混合使用 证明了 pthtread_exit(NULL);退出单个线程是成功的 可行的 。

二 回收子线程

还是在上次的基础 加 pathread_join函数 即可

参数 第一个 :线程id 参数 第二个:函数指针 (二级指针 )二级指针的赋值对象可以是这样的

比如

int **A; //二级指针int *p; //一级指针 A=&p; //赋值过程

三 在栈区定义回收子线程的变量

#include<stdio.h>#include <pthread.h>#include<string.h>void *mychild(void * arg){int h=0;printf("child pthred_create id is %ld",pthread_self());while(h<10){h++;printf("child h===%d\n",h)lsleep(1);if(h==3){int num=111;pthread_exit(&num); }}}int main(){int returns;int i=0;pthread_t pthid;/* &mychild mychild 都可以 *//* 1 &mychild :mychild 表示是一个指针 赋值给二级指针 就需要 & mychild */ /* mychild :本来就是一个地址 也可以直接赋值 */ returns=pthread_create(&pthid,NULL,&mychild,NULL);//创建 线程 // mychild 克隆子线程 printf("peranst pthred_create id is %ld",pthread_self());printf("return information is %s\n",strerror(returns)); void *str=NULL; //函数指针变量初始化赋值pthread_join(pthid,&(str));//回收子线程函数 printf("num===%d\n",*(int *)str);//回收子线程退出携带的值 while(i<10){i++;printf("parenst i====%d\n",i);sleep(1);}return 0;}

出现随机数了

因为你在栈区定义的 是不被共享的 所以值对应不上

四 在堆区定义回收子线程的变量

如果在堆区呢

#include<stdio.h>#include <pthread.h>#include<string.h>int num=111; //堆区定义 void *mychild(void * arg){int h=0;printf("child pthred_create id is %ld",pthread_self());while(h<10){h++;printf("child h===%d\n",h)lsleep(1);if(h==3){pthread_exit(&num); }}}int main(){int returns;int i=0;pthread_t pthid;/* &mychild mychild 都可以 *//* 1 &mychild :mychild 表示是一个指针 赋值给二级指针 就需要 & mychild */ /* mychild :本来就是一个地址 也可以直接赋值 */ returns=pthread_create(&pthid,NULL,mychild,NULL);//创建 线程 // mychild 克隆子线程 printf("peranst pthred_create id is %ld",pthread_self());printf("return information is %s\n",strerror(returns)); void *str=NULL; //函数指针变量初始化赋值pthread_join(pthid,&(str));//回收子线程函数 printf("num===%d\n",*(int *)str);//回收子线程退出携带的值 while(i<10){i++;printf("parenst i====%d\n",i);sleep(1);}return 0;}

也就是验证了 retval 指针必须指向 全局 堆区 这样回收的值 才会正常。

五 取消(杀死)线程

一 pthred_cancel函数使用方式1 直接在子线程 定义三个变量 并且必须做一次系统调用 2 也就是 那句话 先到了系统调用 父线程开始回收先到的 3 这里只有一句话 所以就是本身

如果不确定

直接把这里设置为取消点 取消点理解一个标志位

#include<stdio.h>#include <pthread.h>#include<string.h>void *mychild(void * arg){int h=0;printf("child pthred_create id is %ld",pthread_self());while(h<10){int a=11;int b=22;int c=2222;printf("a==%d b==%d c==%d\n",a,b,c);pthread_testcancel();//确定取消点 }}int main(){int returns;int i=0;pthread_t pthid;/* &mychild mychild 都可以 *//* 1 &mychild :mychild 表示是一个指针 赋值给二级指针 就需要 & mychild */ /* mychild :本来就是一个地址 也可以直接赋值 */ returns=pthread_create(&pthid,NULL,mychild,NULL);//创建 线程 // mychild 克隆子线程 printf("peranst pthred_create id is %ld",pthread_self());printf("return information is %s\n",strerror(returns)); void *str=NULL; //函数指针变量初始化赋值pthread_join(pthid,&(str));//回收子线程函数 printf("num===%d\n",*(int *)str);//回收子线程退出携带的值 while(i<10){i++;printf("parenst i====%d\n",i);sleep(1);}return 0;}

printf 为系统调用函数 也就是 输出了 那么父线程开始回收 子进程的while(1)的内容

一直在打印 并且后台生成了 ./a.out

kill -9 7480 (杀死子进程 父进程无法回收了)

ps aux 查看 是否还存在./a.out

验证成功 不存在了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。