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语言详解冒泡排序实现

    冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序
    2022-04-04
  • C++中实现WebSocket通信的两种方法:libwebsockets库、Boost.Beast‌库

    C++中实现WebSocket通信的两种方法:libwebsockets库、Boost.Beast‌库

    C++中WebSocket库主要有以下几个‌:cpp-websocket‌、asio_websocket‌、websockets++‌、‌websocketpp‌、‌libwebsockets‌、‌uWebSockets‌、Boost.Beast‌、Simple-WebSocket-Server‌,这篇文章使用libwebsockets库、Boost.Beast‌库来实现c++中的WebSocket通信
    2025-01-01
  • PTA刷题C语言编程顺序颠倒输出实现

    PTA刷题C语言编程顺序颠倒输出实现

    本篇文章是在刷PTA题目是遇到的一道题,给定一句话,要求将句中所有单词顺序颠倒输出,本文来带你解答,有需要的朋友可以借鉴参考下
    2021-09-09
  • 一文带你深入了解C++中的类型转换

    一文带你深入了解C++中的类型转换

    在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。本文主要介绍了C++中常见的四个类型转换,需要的可以参考一下
    2022-12-12
  • 详解Dijkstra算法之最短路径问题

    详解Dijkstra算法之最短路径问题

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。本文将介绍其原理,并用C++实现
    2021-06-06
  • c++ class中成员与分配内存的问题详解

    c++ class中成员与分配内存的问题详解

    很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的,下面这篇文章主要给大家介绍了关于c++ class中成员与分配内存问题的相关资料,需要的朋友可以参考下
    2021-10-10
  • C++栈(stack)的模板类实现代码

    C++栈(stack)的模板类实现代码

    这篇文章主要为大家详细介绍了C++栈(stack)的模板类实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C语言函数指针与回调函数的实现

    C语言函数指针与回调函数的实现

    本文主要介绍了C语言函数指针与回调函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • vs2022重新编译opencv-python cuda加速时报错的问题解决

    vs2022重新编译opencv-python cuda加速时报错的问题解决

    本文主要介绍了vs2022重新编译opencv-python cuda加速时报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Objective-C限制函数调用的频率详解

    Objective-C限制函数调用的频率详解

    这篇文章主要给大家介绍了关于Objective-C限制函数调用的频率的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12

最新评论