pthread_exit和pehread_join函数

news2024/9/30 19:35:01

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.coloradmin.cn/o/1472644.html

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

相关文章

【基础知识】MPP架构和hadoop架构比对

架构比对 简单一句描述。 mpp架构&#xff0c;就是找一群和自己能力差不多的任一起做事&#xff0c;每个人做的事情是一致的。 hadoop架构&#xff0c;就是找一群能力差一些的人&#xff0c;但只需要他们每个人只做一部分工作。 举例说明 一个特色小饭店如何成为连锁餐饮巨…

【国密算法】深入理解国密算法:原理、实践及注意事项

目录 引言 1. 国密算法概述 2. 国密算法的实践应用 2.1 对称加密&#xff08;SM1算法&#xff09; 2.2 非对称加密&#xff08;SM2算法&#xff09; 2.3 哈希算法&#xff08;SM3算法&#xff09; 3. 国密算法的注意事项 结论 引言 国密算法&#xff0c;即中国密码算法…

AI数字人SadTalker实战

1.概述 AI数字人在营销和品牌推广中扮演着至关重要的角色&#xff0c;许多企业和个人正积极利用数字技术来打造属于自己的财富。有没有一种简单而免费的方式来创建自己的数字人呢&#xff1f;本篇博客笔者将为大家介绍如何搭建属于自己的AI数字人。 2.内容 2.1 什么是SadTalker…

内存卡无法读取?这里有救!

一、遭遇内存卡无法读取的困境 在日常生活和工作中&#xff0c;我们越来越依赖电子设备来存储和传输数据。然而&#xff0c;当遇到内存卡无法读取的问题时&#xff0c;很多人会感到困惑和焦虑。无论是重要的工作文件、珍贵的家庭照片&#xff0c;还是其他个人数据&#xff0c;…

基于springboot+vue的音乐网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

C++力扣题目 42--接雨水 84--柱状图中最大的矩形

42. 接雨水 力扣题目链接(opens new window) 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1a;6解释&#xff…

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

原型设计工具Axure RP

Axure RP是一款专业的快速原型设计工具。Axure&#xff08;发音&#xff1a;Ack-sure&#xff09;&#xff0c;代表美国Axure公司&#xff1b;RP则是Rapid Prototyping&#xff08;快速原型&#xff09;的缩写。 下载链接&#xff1a;https://www.axure.com/ 下载 可以免费试用…

windows安装onlyoffice8.0

安装erlang 安装Erlang25.3 下载地址 设置环境变量 ERLANG_HOME C:\Program Files\Erlang OTP Path下设置%ERLANG_HOME%\bin 打开cmd输入erl不报错即可 安装rabbitmq rabbitmq和erlang对应的关系 下载地址 执行完exe文件后&#xff0c;找到安装目录下的sbin&am…

H12-821_77

77.如图所示的交换网络&#xff0c;所有交换机都运行了STP协议&#xff0c;当拓扑稳定后&#xff0c;在以下哪台交换机上修改配置BPDU的发送周期&#xff0c;可以影响STD配置BPDU的发送周期&#xff1f; A.STC B.SWD C.SWA D.SWB 答案&#xff1a;C 注释&#xff1a; 在根桥上…

MATLAB环境下基于超高斯全自动组织学图像的盲彩色反卷积方法

图像盲反卷积问题仅根据模糊图像估计清晰图像和模糊核&#xff0c;也是一个欠定问题且求解更加困难。但图像盲反卷积算法更实际&#xff0c;因为许多情况下&#xff0c;模糊核都是未知或部分已知的。求解盲反卷积问题需要为未知量选择适当的先验模型&#xff0c;以得到清晰图像…

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5 二叉树的…

基于springboot+vue的二手图书交易平台(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 前台系统功能模块分为 后台系统功能模块分为 三、库表设计 四、论文 前言 在互联网上所有产品的分类信息中&#xff0c;电子类的产品信息无疑是最丰富的&#xff0c;一大批电子资讯类网站从中国互联网诞生初期就开始为…

力扣模板题:回文链表

请牢记检测回文串的模板 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool isPalindrome(struct ListNode* head) {int size0;struct ListNode* pointhead;while(point){size;pointpoint->next;}int arr…

每日学习-2月22日

知识点&#xff1a;二叉树 二叉树的性质&#xff1a; 二叉树的存储结构&#xff1a; 顺序存储&#xff1a; 用数组存储&#xff0c;tree[ 0 ]处空缺&#xff0c;以便编号与下标一致对标完全二叉树&#xff0c;按序号存储在相应索引的位置 i的左孩子&#xff1a;2i i的右孩…

代码随想录Leetcode416. 分割等和子集

题目&#xff1a; 代码(首刷看解析 2024年2月23日&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {/*因为数值 < 100, length < 200 , 数值 < 20000*/vector<int> dp(10001, 0);int sum accumulate(nums.begin(), num…

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够”

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够” 关于武汉三类人员&#xff08;安全员ABC&#xff09;考试小题库&#xff0c;一般都是考试时间出来&#xff0c;准考证下来了&#xff0c;匹配题库&#xff0c;好好看题&#xff08;认真练习即可&#xff09;&#xff0c;一般…

校园微社区微信小程序源码/二手交易/兼职交友微信小程序源码

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

C++ 之LeetCode刷题记录(三十四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xf…

操作系统-复试笔记

http://t.csdnimg.cn/PJLWh 操作系统基础 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;用于…