一 回顾
1 用 pthread_create 函数 并且在main最后 加上sleep(2);
2 看到了明显的父子线程抢占现象
3 本质和fork 函数 类似
接上一次内容 继续加上一点东西
二 错误打印
不可以用 perror 函数
引出一个strerror 函数
形参为 pthread_create函数返回值
#include<stdio.h>
#include <pthread.h>
#include<string.h>
void *mychild(void * arg)//指针函数 每个地址存放一个函数 可以赋值给二级指针
{
printf("child pthred_create id is %ld",pthread_self());
}
int main()
{
int returns;//返回值
pthread_t pthread;
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));
return 0;
}
成功就是返回成功信息
错误就是返回错误信息
三单个线程退出 实验1
先在 main 最后 退出父线程 看看现象
#include<stdio.h>
#include <pthread.h>
#include<string.h>
void *mychild(void * arg)
{
printf("child pthred_create id is %ld",pthread_self());
}
int main()
{
int returns;
int i=0;
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));
pthread_exit(NULL);//父线程单个任务退出
while(i<10)
{
i++;
printf("parenst i====%d\n",i);
sleep(1);
}
return 0;
}
父线程退出之后 不会执行while里面的内容 而是接着去执行子进程了
证明是单个父线程退出是成功的
四 单个线程退出 实验2
如果 在 子线程加 exit(0);呢 用 进程的方式退出
#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)
{
exit(0); //用 进程的方式退出
}
}
}
int main()
{
int returns;
int i=0;
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));
while(i<10)
{
i++;
printf("parenst i====%d\n",i);
sleep(1);
}
return 0;
}
父线程的 while 内容 并没有打印完 也就是 子进程退出之后 父进程也被退出了
也就是 用exit(0):退出的是全部线程的操作(包括父线程)。
因为过程中会发生抢占 可能会导致父线程比子线程打印的多一点
五 单个线程退出 实验3
把 exit(0)改为 pathread_exit(NULL);
或者 return NULL 或者 写一个函数 在里面写 pathread_exit(NULL);
为什么写一个函数也是行的
因为当你写了一个函数之后 系统会在栈区开辟一个独立的地址 分配个函数独立使用
也就是对应了我们 栈区不共享的概念
#include<stdio.h>
#include <pthread.h>
#include<string.h>
void childxiancheng()//系统分配出的独立栈区 (子线程的)
{
pthread_exit(NULL);
}
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);
sleep(1);
if(h==3)
{
pthread_exit(NULL); //法1
// childxiancheng(); //法2
// return NULL;//法3
}
}
}
int main()
{
int returns;
int i=0;
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));
while(i<10)
{
i++;
printf("parenst i====%d\n",i);
sleep(1);
}
return 0;
}