开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Pthread_exit 线程退出】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11062
Pthread_exit 线程退出
内容介绍:
一、线程退出
二、线程退出函数
一、线程退出
在进程中我们可以调用 exit 函数或者_exit 函数来结束进程,在一个线程中我们可以通过以下三种方式,在不终止整个进程的情况下停止它的控制流。
给出以下代码:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void * thread_fun1(void * arg)
{
int i=0;
char *str ="hello world";
printf("%s\n",(char *)arg);
while(1)
{
i++;
if(i==5)
exit(0);
for(i=0;i<5;i++)
printf("this is thread 1\n");
sleep(1);
}
return str;
}
void *thread_fun2(void *arg)
{
printf(“%d\n”,*((int*)arg));
while(1)
{
Printf(“this is thread 2\n”);
Sleep(1);
}return NULL;
}
以上代码1中进程1调用了 exit 函数,结束了 exit 所在的进程,导致进程2无法运行以及整个进程的终止。
1. 线程从执行函数中返回。
将进程1中调用的 exit 函数替换成return。在线程函数中执行 return 0 或者 return NULL 是结束这个线程函数, return的功能是结束 return 所在的函数。在不终止整个进程的情况下,可以通过在线程函数中调用 return 函数结束线程函数,以此来结束线程;线程结束,线程函数同样结束,但是此时进程2依然可以继续运行,进程1并没有结束整个进程。
2. 线程调用 pthread_exit 退出线程。
调用 exit 函数不能达到预期效果,但是调用 pthread_exit 函数是可行的,不同于 return 函数,在任何地方调用 pthread_exit 函数,都可以达到结束线程但是不会结束进程的效果
3. 线程可以被同一进程中的其它线程取消。
其他线程给这个线程发送一个取消请求,这个线程就会结束。
二、线程退出函数
给出以下代码:
#include<pthread.h>
void pthread_exit(void *retval);
功能:退出调用线程。相当于 exit 结束进程, pthread_exit 函数用于结束线程,其中 retval 是返回地址,相当于 return 返回的指针。
参数: retval: 存储线程退出状态的指针。
注:一个进程中的多个线程是共享该进程的数据段,因此,通常线程退出后所占用的资源并不会释放。共享的资源不会被释放,例如全局的变量,全局的数组不会被释放,只是这个线程组独有的资源会被释放。
给出以下代码:
void * thread_fun1(void * arg)
{
int i=0;
char *str ="hello world";
printf("%s\n",(char *)arg);
while(1)
{
i++;
if(i==5)
return NULL;
printf("this is thread 1\n");
sleep(1);
}
return str;
}
将进程1中 return NULL 替换成 pthread_exit(NULL),此时运行程序发现,当i=5时,线程1会退出,但是线程2仍然继续运行,整个进程未受到影响。
以下代码类似:
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
void *thread(void *arg)
{
int i=0;
while(l)
{
printf(“I am running\n”);
sleep(l);
i++;
if(i=3)
{
Pthread exit((void *)l) ;
}
}
return NULL;
}
int main(int argc, char *argv[ ])
{
int ret = 0;
pthread t tid;
void *value = NULL;
ret =pthread_create(&tid,NULL,thread,NULL);
if(ret!=0)
perror(“pthread_create”);
pthread_join(tid,&value);
printf(“value = %p\n”,(int *)value);
return 0;
}
可以看出,以上代码只有一个线程,当程序运行到 i=3时,调用 pthread_exit 函数使线程结束,并且将1返回到一个地址。
其中,main 函数的作用是,创建了线程,如果线程不结束,程序会继续运行,如果线程结束,那么它将达到返回值,将1转化成指针也就是一个地址;而 pthread_join 的作用是当线程退出之后,打出返回值,其中%p可以替换成%d让其变为整型。
整个程序验证的是,三秒钟后这个线程通过 pthread_exit 函数结束,而 join 可以让它达到返回值,即 pthread_exit 函数可以达到结束线程但是不终止整个进程的效果。