Pthread_exit 线程退出|学习笔记

简介: 快速学习 Pthread_exit 线程退出

开发者学堂课程【物联网开发- 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 函数可以达到结束线程但是不终止整个进程的效果。

相关文章
|
6月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
126 0
|
29天前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
63 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
29天前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
144 0
|
3月前
|
调度
多线程学习笔记
这篇文章是多线程学习笔记,涵盖了线程与进程的概念、多线程实现方式、线程状态、线程同步与不安全示例、死锁问题以及生产者与消费者问题等多线程编程的关键知识点。
多线程学习笔记
|
5月前
|
Linux API
Linux线程总结---线程的创建、退出、取消、回收、分离属性
Linux线程总结---线程的创建、退出、取消、回收、分离属性
|
6月前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
55 3
|
6月前
|
安全 Java 编译器
多线程 (下) - 学习笔记2
多线程 (下) - 学习笔记
45 1
|
6月前
|
存储 算法 Java
多线程 (下) - 学习笔记1
多线程 (下) - 学习笔记
47 1
|
6月前
|
设计模式 安全 NoSQL
多线程 (上) - 学习笔记2
多线程 (上) - 学习笔记
45 1
|
6月前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
66 4