C语言中pthread_exit和pehread_join的使用

 更新时间:2024年02月27日 09:17:53   作者:落落落sss  
pthread_exit用于强制退出一个线程,pthread_join用于阻塞等待线程退出,获取线程退出状态,本文主要介绍了C语言中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存储了线程结束状态

到此这篇关于java中pthread_exit和pehread_join函数的使用的文章就介绍到这了,更多相关java pthread_exit pehread_join函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 实现优先队列的简单实例

    C++ 实现优先队列的简单实例

    这篇文章主要介绍了C++ 实现优先队列的简单实例的相关资料,希望通过本文能帮助大家实现优先队列,需要的朋友可以参考下
    2017-08-08
  • C/C++中派生类访问属性详解及其作用介绍

    C/C++中派生类访问属性详解及其作用介绍

    这篇文章主要介绍了C/C++中派生类访问属性详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++之动态数组vector解读

    C++之动态数组vector解读

    这篇文章主要介绍了C++之动态数组vector解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • C语言数据结构线性表教程示例详解

    C语言数据结构线性表教程示例详解

    这篇文章主要为大家介绍了C语言数据结构线性表的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • C++中std::vector的具体使用

    C++中std::vector的具体使用

    C++标准库中的std::vector是一种动态数组容器,适用于算法竞赛中的动态数据存储、数组扩展和模拟栈/二维数组等场景,本文就来介绍一下,感兴趣的可以了解一下
    2025-02-02
  • VS2022+libtorch+Cuda11.3安装测试教程详解(调用cuda)

    VS2022+libtorch+Cuda11.3安装测试教程详解(调用cuda)

    这篇文章主要介绍了VS2022+libtorch+Cuda11.3安装测试(调用cuda),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 如何用C++求两个数的最大公约数和最小公倍数

    如何用C++求两个数的最大公约数和最小公倍数

    最大公约数是指两个或多个整数共有约数中,最大的一个约数,常用的方法是欧几里得算法,也叫辗转相除法,下面这篇文章主要给大家介绍了关于如何用C++求两个数的最大公约数和最小公倍数的相关资料,需要的朋友可以参考下
    2023-01-01
  • C++左值与右值核心判断方法

    C++左值与右值核心判断方法

    C++ 11 引入右值引用和移动语义后,左值右值的区分变得更加重要,本文介绍C++左值与右值核心判断方法,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2026-06-06
  • C语言详细讲解二分查找用法

    C语言详细讲解二分查找用法

    二分查找法,又叫做折半查找法,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
    2022-04-04
  • Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例

    Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例,本文代码中包含注释来讲解CCControlPotentiometer控件类的使用,需要的朋友可以参考下
    2014-09-09

最新评论