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 函数可以达到结束线程但是不终止整个进程的效果。

相关文章
|
2天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
44 0
|
2天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
19 4
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
|
2天前
|
Java C++
多线程学习笔记(二)
1. 子线程先执行:启动子线程后立即调用`join()`,主线程会等待子线程完成。 `suspend()`方法。 3. `synchronized` vs `Lock`:前者是关键字,后者是接口;前者可用在代码块和方法,后者在代码中显式;前者自动释放锁,后者需`finally`释放;前者无超时/中断控制,后者可设定;前者非公平,后者可公平/不公平,且支持读写锁。 4. `synchronized`底层实现:基于 Monitor 模型,JVM层面的锁定机制,通过 monitors 和 monitorenter/monitorexit 指令实现。
|
2天前
|
Java Linux API
Linux C/C++ 开发(学习笔记五):线程池
Linux C/C++ 开发(学习笔记五):线程池
24 0
|
2天前
|
安全 Linux 调度
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
45 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
68 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置
|
9月前
|
Java
java202303java学习笔记第三十九天自定义线程池详解1
java202303java学习笔记第三十九天自定义线程池详解1
29 0
|
9月前
|
Java 调度
JAVA基础 多线程技术学习笔记(V1.0) 2
JAVA基础 多线程技术学习笔记(V1.0)
|
10月前
|
Java C++
java 编程思想 多线程学习笔记
java 编程思想 多线程学习笔记
80 0