一 回顾
用了 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)l
sleep(1);
if(h==3)
{
int num=111;
pthread_exit(&num);
}
}
}
int main()
{
int returns;
int i=0;
returns=pthread_create(&pthid,NULL,mychild,NULL);
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)l
sleep(1);
if(h==3)
{
pthread_exit(&num);
}
}
}
int main()
{
int returns;
int i=0;
returns=pthread_create(&pthid,NULL,mychild,NULL);
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;
returns=pthread_create(&pthid,NULL,mychild,NULL);
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
验证成功 不存在了
|