pthread_exit和pehread_join函数

pthread_exit:

在线程中禁止调用exit函数,否则会导致整个进程退出,取而代之的是调用pthread_exit函数,这个函数只会使一个线程退出,如果主线程使用pthread_exit函数也不会使整个进程退出,不会影响其他线程的执行

函数原型:void pthread_exit(void *retval);

函数参数:retval通常传NULL

注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者使用nalloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时,这个线程函数已经退出了,栈空间会被回收

通过以下代码我们可以发现子线程执行exit会让整个进程结束。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <pthread.h>
void *mythread(void *arg)
{printf("child thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self());exit(0);
}
int main()
{//int pthread_create(pthread_t *thread, const pthread_attr_t *attr,//  void *(*start_routine) (void *), void *arg);pthread_t thread;int ret=pthread_create(&thread,NULL,mythread,NULL);if(ret!=0){printf("pthread_create error:[%s]\n",strerror(ret));return -1;}sleep(1);//让子线程先执行printf("father thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self());
}

 

可以发现主线程并没有执行

通过以下代码可以发现主线程执行pthread_exit函数后,子线程还可以执行:
 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <pthread.h>
void *mythread(void *arg)
{sleep(1);//保证主线程先执行printf("child thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self());
}
int main()
{//int pthread_create(pthread_t *thread, const pthread_attr_t *attr,//  void *(*start_routine) (void *), void *arg);pthread_t thread;int ret=pthread_create(&thread,NULL,mythread,NULL);if(ret!=0){printf("pthread_create error:[%s]\n",strerror(ret));return -1;}printf("father thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self());pthread_exit(NULL);
}

pthread_join函数:

函数作用:阻塞等待线程退出,获取线程退出状态。其作用跟进程的waitpid()函数相似

函数原型:int pthread_join(pthread_t thread, void **retval);

函数返回值:

  • 成功返回0;
  • 失败返回错误号;

函数参数:

thread:线程id

retval:存储线程结束状态,整个指针和pthread_exit的参数是同一块内存地址 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <pthread.h>
void *mythread(void *arg)
{int *p=(int *)malloc(sizeof(int));(或者用全局变量)*p=9;printf("child thread,id==[%ld],add==[%p]\n",pthread_self(),p);pthread_exit(p);
}
int main()
{//int pthread_create(pthread_t *thread, const pthread_attr_t *attr,//  void *(*start_routine) (void *), void *arg);pthread_t thread;int ret=pthread_create(&thread,NULL,mythread,NULL);if(ret!=0){printf("pthread_create error:[%s]\n",strerror(ret));return -1;}// int pthread_join(pthread_t thread, void **retval);void *pt=malloc(sizeof(void));pthread_join(thread,&pt);int n=*(int *)pt;printf("child exit status:[%d],add==[%p]\n",n,pt);
}

可以发现p和pt的地址是一样的 ,pt存储了线程结束状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫描TestNG框架编写的自动化用例确认其中是否包含断言的方法

在测试工作中&#xff0c;要确认TestNG框架编写的自动化用例中是否包含断言&#xff0c;我们可以使用一些静态代码分析工具。静态代码分析工具可以在不执行代码的情况下检查代码&#xff0c;发现可能的错误、代码异味或者不符合编码规范的地方。对于TestNG框架&#xff0c;一种…

Python元组详细教程

Python中的元组&#xff08;tuple&#xff09;是一种不可变的有序序列类型&#xff0c;用于存储多个值。由于元组是不可变的&#xff0c;因此你不能修改元组中的元素&#xff0c;但你可以访问和操作元组中的元素。 创建元组 你可以使用圆括号 () 来创建元组&#xff0c;元组中…

新媒体运营-定位及呈现方式篇

常见呈现方式:真人口述、小剧情、记录(边走边说)、Vlog+场景、画外音+场景、视频/图+文案 标题 是写给潜在客户看的, 内容 是给我们的目标用户看的。 01 要有核心内容 写文案从模仿开始,依样画葫芦 然后形成一套顺手的体系公式 02 要方便用户搜索 关键词、话题、连带关联词…

【JavaScript 漫游】【022】事件模型

文章简介 本篇文章为【JavaScript 漫游】专栏的第 022 篇文章&#xff0c;对 JavaScript 中事件模型相关的知识点进行了总结。 监听函数 浏览器的事件模型&#xff0c;就是通过监听函数&#xff08;listener&#xff09;对事件做出反应。事件发生后&#xff0c;浏览器监听到…

2.23日学习打卡----初学Nginx(二)

2.23日学习打卡 目录: 2.23日学习打卡一. Nginx 虚拟主机虚拟主机的分类Nginx支持三种类型的虚拟主机配置Nginx虚拟主机单网卡多IP配置Nginx虚拟主机_基于域名虚拟主机配置Nginx虚拟主机基于多端口的配置4 二. Nginx 核心指令root和alias指令的区别return指令rewrite指令rewrit…

MySQL-行转列,链接查询

1. 行转列 1.1 示例数据准备 create table test_9(id int,name varchar(22),course varchar(22),score decimal(18,2) ); insert into test_9 (id,name,course,score)values(1,小王,java,99); insert into test_9 (id,name,course,score)values(2,小张,java,89.2); inse…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

西宾视频下载工具(mediadown)

一个支持多网站的视频下载工具。目前已经支持的网站有知乎、哔哩哔哩、得到、猫耳、蜻蜓FM。 西宾视频下载工具能够帮助你下载知乎知学堂、哔哩哔哩、得到课程、猫耳音频、蜻蜓FM的音视频文件。如果你是这些网站的会员&#xff0c;它还能帮你下载会员节目的音视频。 工具也不是…

【大厂AI课学习笔记NO.54】2.3深度学习开发任务实例(7)数据标注和数据集拆分

数据标注 有时我们会把特征工程和数据集的标注弄混淆&#xff0c;在普通的机器学习项目中&#xff0c;我们需要进行特征工程&#xff0c;但是在深度学习项目过程中&#xff0c;我们需要进行数据标注工作。 标注工具 在本案例中&#xff0c;使用的是开源的标注工具Labelme&am…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…

Elasticsearch 创建index库 timeout

问题概述 使用 python 客户端 代码进行创建,【之前成功创建,但是现在出现报错,报错代码es_connection.client.indices.create】def create_vector_index(dataset_index_name,vector_query_field,query_field):es_connection = get_collention(dataset_index_name,vector_que…

Redis+Caffeine 太强了!二级缓存可以这样实现!

在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。 在一些场景下可能还需要进一步配合本地缓存使用&#xff0c;例如Guava cache或Caffeine&#xff0c;从而再次提升程序的响应…

Keil5 配置jlink及jlink下载程序,程序没有运行

1.先选好对应的芯片设备 之后步骤参考这个&#xff1a;MDK5 JLINK配置流程_keil5配置jlink仿真器步骤-CSDN博客 2.jlink下载程序之后板子没有运行可以查看reset and run是否有没有勾选

享元模式(Flyweight Pattern)

定义 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是通过共享尽可能多的数据来减少内存使用和提高性能。它通常在需要创建大量相似对象的情况下使用&#xff0c;以减少对象的数量和内存消耗。 示例 #include <iostream…

扫雷2(2537)

题目描述 扫雷游戏是一款十分经典的单机小游戏。它的精髓在于&#xff0c;通过已翻开格子所提示的周围格地雷数&#xff0c;来判断未翻开格子里是否是地雷。现在给出 m 行 n 列的雷区中的地雷分布&#xff0c;要求计算出每个非地雷格的周围格地雷数。 注&#xff1a;每个格子周…

docker build基本命令

背景 我们经常会构建属于我们应用自己的镜像&#xff0c;这种情况下编写dockerfile文件不可避免&#xff0c;本文就来看一下常用的dockerfile的指令 常用的dockerfile的指令 首先我们看一下docker build的执行过程 ENV指令&#xff1a; env指令用于设置shell的环境变量&am…

1019: 【C1】【循环】【for】满足条件的数累加

题目描述 将正整数 m 和 n 之间&#xff08;包括 m 和 n&#xff09;能被 17 整除的数累加。其中&#xff0c;0 < m < n < 1000。 输入 一行&#xff0c;包含两个整数m和n&#xff0c;其间&#xff0c;以一个空格间隔 输出 输出一行&#xff0c;包行一个整数&…

【c语言】字符函数和字符串函数(下)

前言 书接上回 【c语言】字符函数和字符串函数(上) 上一篇讲解的strcpy、strcat、strcmp函数的字符串长度是不受限制的 而本篇strncpy、strncat、strcnmp函数的字符串长度是受限制的 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;…

JANGOW: 1.0.1

kali:192.168.223.128 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -p- 192.168.223.154 开启了21 80端口 web看一下&#xff0c;有个busque.php参数是buscar,但是不知道输入什么&#xff0c;尝试文件包含失败 扫描目录 dirsearch -u http://192.168.223.154 dirse…

Python的字符串操作你用对了吗?

1.创建字符串 字符串指的是使用一对单引号或者一对双引号或者一对三个单引号或者一对三个双引号包裹的文本 # 创建字符串str1 hellostr2 "world"print(str1)print(str2) # 使文本原样输出str3 床上明月光&#xff0c;疑是地上霜。str4 """举头望…