Linux pthread_exit及线程清理函数

Stata实战:用双向固定效应模型分析房价,从数据清洗到结果解读(附完整代码) 本文详细介绍了如何使用Stata实现房价数据的双向固定效应模型分析,从数据清洗到结果解读的全流程。通过具体代码示例,帮助读者掌握面板模型的应用技巧,特别适合经济学和金融学研究者进行房价影响因素分析。 阅读详情

pthread_exit


关于线程的终止

单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。
(1)线程只是从例程中返回,返回线程的退出码。
(2)线程可以被同一进程中的其他线程取消。
(3)线程调用pthread_exit。


头文件

#include <pthread.h>


函数原型

void pthread_exit(void *retval);

参数

retval是一个无类型指针,与传给启动例程的单个参数类似。同一进程中的其他线程可调用pthread_join函数访问这个指针。调用了pthread_join的线程会一直阻塞直到它指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程从启动它的例程返回,retval将包含返回码。若线程被取消则retval指定的内存空间会被置为PTHREAD_CANCELED。

unix环境高级编程

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

void *thr_fn1(void *arg)
{
	printf("thread 1 returning\n");
	return((void *)1);
}

void * thr_fn2(void *arg)
{
	printf("thread 2 exiting\n");
	pthread_exit((void *)2);
}

int main(void)
{
	int err;
	pthread_t tid1, tid2;
	void *tret;

	err = pthread_create(&tid1, NULL, thr_fn1, NULL);
	if(err != 0)
	{
		printf("can't create thread 1: %s\n", strerror(err));
	}
	err = pthread_create(&tid2, NULL, thr_fn2, NULL);
	if(err != 0)
	{
		printf("can't create thread 2: %s\n", strerror(err));
	}
	err = pthread_join(tid1, &tret);
	if(err != 0)
	{
		printf("can't join with thread 1: %s\n", strerror(err));
	}
	printf("thread 1 exit code %d\n", (int)tret);
	err = pthread_join(tid2, &tret);
	if(err != 0)
	{
		printf("can't join with thread 2: %s\n", strerror(err));
	}
	printf("thread 2 exit code %d\n", (int)tret);
	exit(0);
}


线程清理


头文件

#include <pthread.h>

函数原型

int pthread_cancel(pthread_t thread);
void pthread_cleanup_push(void (*routine)(void *),
                                 void *arg);
void pthread_cleanup_pop(int execute);


功能

线程可以调用pthread_cancel函数来请求取消同一进程中的其他线程。在默认情况下pthread_cancel函数会使由thread标识的线程的行为表现为如同调用了参数为PTHREAD_CANCELED的pthread_exit函数,必须特别注意的是,pthread_cancel并不等待线程的终止。它仅仅提出请求。后两个函数被称为线程清理处理函数,线程可以建立多个清理处理函数。处理程序记录在栈空间,所以它们的执行顺序与它们的注册时的顺序相反。

说明

当线程执行动作(1)调用pthread_exit时,(2)响应取消请求时,(3)用非零execute参数调用pthread_cleanup_pop时调用清理函数,调用参数arg,清理函数routine的调用顺序是由pthread_cleanup_push函数来安排的。
如果execute参数置为0,清理函数将不被调用。

unix环境高级编程的例子

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

void cleanup(void *arg)
{
	printf("cleanup: %s\n", (char *)arg);
}

void *thr_fn1(void *arg)
{
	printf("thread 1 start\n");
	pthread_cleanup_push(cleanup, "thread 1 first handler");
	pthread_cleanup_push(cleanup, "thread 1 second handler");
	printf("thread 1 push complete\n");
	if(arg)
	{
		return((void *)1);
	}
	pthread_cleanup_pop(0);
	pthread_cleanup_pop(0);
	return((void *)1);
}

void *thr_fn2(void *arg)
{
	printf("thread 2 start\n");
	pthread_cleanup_push(cleanup, "thread 2 first handler");
	pthread_cleanup_push(cleanup, "thread 2 second handler");
	printf("thread 2 push complete\n");
	if(arg)
	{
		pthread_exit((void *)2);
	}
	pthread_cleanup_pop(0);
	pthread_cleanup_pop(0);
}

int main(void)
{
	int err;
	pthread_t tid1, tid2;
	void *tret;

	err = pthread_create(&tid1, NULL, thr_fn1, (void *)1);
	if(err != 0)
	{
		printf("can't create thread 1: %s\n", strerror(err));
	}

	err = pthread_create(&tid2, NULL, thr_fn2, (void *)1);
	if(err != 0)
	{
		printf("can't create thread 2: %s\n", strerror(err));
	}

	err = pthread_join(tid1, &tret);
	if(err != 0)
	{
		printf("can't join with thread 1: %s\n", strerror(err));
	}

	printf("thread 1 exit code %d\n", (int)tret);

	err = pthread_join(tid2, &tret);
	if(err != 0)
	{
		printf("can't join with thread 2: %s\n", strerror(err));
	}

	printf("thread 2 exit code %d\n", (int)tret);
	exit(0);
}


PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计 PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。 阅读详情

相关推荐

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

pthread_exit()退出线程

退出当前线程而不影响子线程运行

weixin_42106735的博客 558

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

funfan的博客 5198

线程中慎用exit

在编程过程中,出现 send:Connection reset by

wyq393562305的专栏 5284

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8853

ML.NET在工业上位机中的深度应用:如何用C#实现10ms级预测推理?

模型要“够用就好”:工业场景的规律往往不复杂,别迷信深度学习,FastTree、线性模型足够应付80%的场景,且速度快3-5倍;预处理“能省就省”:离线做90%的特征工程,实时只处理动态变化的10%,这是突破10ms的关键;代码“贴近硬件”:用struct、数组池、SIMD等“非托管技巧”写C#,避免GC成为实时性瓶颈;测试“模拟极端”:在目标工控机上用100%负载(同时跑PLC通信、运动控制、视觉检测)测试推理延迟,确保极端情况下仍达标。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 742

多线程编程(四)——线程终止

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34117522的博客 140

第三章-python基础语法

有C语言基础应该这样学 Python。

qq_46187594的博客 1176

UNIX环境高级编程(第11章 线程)

线程原语包括pthread_create,pthread_exit,pthread_join,pthread_cancel,pthread_self,pthread_cleanup_push等

瓦釜苑 718

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 740

线程终止的方式

单个线程在不终止整个进程的情况下停止他的控制流 (1). 线程从启动例程中返回,返回值是线程的退出码 (2). 线程可以被统一进程中的其他线程取消  (3). 线程调用pthread_exit. 获取线程退出状态: #include #include void* thr_fn1(void* arg) { printf("thread 1 returning\n"

Lce的专栏 813

linux内核协议栈 TCP选项之SACK选项概述

目录 1SACK概述 1.1 SACK允许选项 1.2 SACK选项 2SACK允许选项的发送 2.1 SYN段发送 2.2 接收SYN段 2.2.1 struct tcp_options_received 2.2.2 tcp_parse_options() 2.3 发送SYN+ACK段 3D-SACK 1SACK概述 标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...

2732

Linux 线程2-线程ID获取、回收线程空间pthread_join、线程状态设置pthread_detach、线程退出pthread_exit、线程取消pthread_cancel、线程清理函数

Linux 线程2-线程ID获取pthread_self、回收线程空间pthread_join、线程状态设置pthread_detach、线程退出pthread_exit、线程取消pthread_cancel:pthread_setcancelstate线程的取消状态、pthread_testcancel线程的取消点、pthread_setcanceltype线程的取消类型、线程取消点分类、线程清理函数pthread_cleanup_pop

weixin_45925859的博客 1126

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

线程(四):清理机制+线程属性设置

函数原型:功能:为当前线程注册一个清理函数(在注销pop之前,也就是push和pop之间,如果退出,就会触发清理动作)参数:@routine: 指向要注册的清理函数@arg : 清理函数的参数函数原型:功能:注销清理函数参数:execute: 是否要强制清理0: 自动清理1: 强制清理。

m0_52864526的博客 413

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux_C编程—线程的终止

文章目录线程的终止情况使用return返回线程调用pthread_exit()终止线程非正常终止时清理线程资源例程 线程的终止情况 Linux中有俩种方式可以使线程正常终止: 通过return从线程函数返回 通过调用pthread_exit()函数,使线程退出 另外线程受到其他线程的干扰或者自身出错,都会导致线程非正常终止,而这种终止是不可预见的。 无论线程是正常终止还是非正常终止,都会涉及到...

肥宅快乐博客 1526

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

线程分离、线程退出和线程清理

线程的分离和退出详细讲解,多多案例,快来学

BEIFEN13的博客 2867

linux线程(9)----linux高级编程之线程间的通信 线程清理处理程序(pthread_cleanup_push和pthread_cleanup_pop)

linux高级编程之线程间的通信(pthread_cleanup_push和pthread_cleanup_pop) 线程可以安排他退出时需要调用的函数,这与进程可以用atexit函数安排进程退出时需要调用的函数是类似的。这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说他们的执行顺序与他们注册的顺序相反。 pthread_cleanup_push和pthread_cleanup_pop函数原型如下: 头文件:#includ...

qinjie的博客 334

pthread终止线程(linux编程)

linux终止线程 正常情况下,线程一旦创建便从指定函数开始执行直到该函数返回。一旦该函数返回,这些线程便自行终止。线程也可以在执行的途中通过调用pthread_exit()终止自己的执行。实际上,非初始线程(这里只main函数的线程)从开始函数返回是返回到线程库中,由线程库隐含地调用函数pthread_exit(),并用开始函数的返回值作为线程的出口状态。但是,初始线程则不然。初始线程如果也调用相同的开始函数,在这个函数没有明显调用pthread_exit()的情况下,它将正常返回到其调用点。 线程终止并

Savage888777的博客 1631

APUE2勘误-11.5节 线程终止(关于线程清理处理程序)

平台:Linux 2.6.28-19-generic 书中讲解所用的linux版本为Linux 2.4.22,我没有在此版本上做实验的机会,只是在当前用的版本上做了测试,问题原因可能是Linux内核版本升级导致对线程终止的处理方式进行了改动。 代码如下: 1 #include "apue.h" 2 #include <pthread.h> 3 4 void 5 clean...

weixin_30824277的博客 70

linux 多线程 pthread_create返回11,linux-多线程设计pthread_create、pthread_exit、pthread_join、pthread_self、pthrea...

创建线程:# include int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,void *(*start_rtn), void *arg)tidp:创建线程时返回线程idattr:线程属性(通常为空)start_rtn:线程要执行的函数arg:start_rtn的参数返回值:创建成功就返回0,否则为非0;编译因为pthr...

weixin_35986494的博客 413

linux线程的创建与删除

linux线程的创建与删除 使用linux线程时,编译时需要包含-pthread选项。 Linux通用API返回0表示成功,返回-1表示失败,并设置errno以标识错误原因。但Pthreads相关的API却与之不同,返回0 表示成功,返回正值表示失败,正值的含义与errno相同。 我们可以使用pthread_create()来创建线程。创建成功后的线程可以使用如下几种方式终止: 线程主函数中执行return语句并返回指定值。 调用pthread_exit()函数终止线程 调用pthread_cancel(

guoweilkd的博客 2692

线程创建函数与实例

1 线程常见函数 1.1 线程创建于回收 (1)pthread_create 主线程用来创造子线程 (2)pthread_join 主线程用来等待(阻塞)回收子线程 (3)pthread_detach 主线程用来分离子线程,分离后主线程不必再去回收子线程 小结:线程函数创建的线程,就是里面函数指针指向的函数体,整个函数是一个线程,里面定义,申请的内存资源...

qq_40334837的博客 1923

自学嵌入式第N+1天(Linux篇——线程)

上一篇讲了进程,我们知道了进程的创建过程就是复制他的父进程,以此来提高他的并发。那么进程和线程有啥区别呢?进程是重量级线程,资源分配的基本(最小)单位,更侧重成为一个资源分配的单位线程轻量级进程,线程是CPU的基本调度单位,线程侧重于成为一个执行体 ,执行单位进程组成 = pcb + [text|data|bss|堆|栈]线程组成 = 线程ID + 程序计数器 + 一组相关寄存器 + 栈空间 (由于其他几个所占内存都非常小,栈空间比他们大很多,所以线程就是就约等于栈空间大小)

atwdklm的博客 378

Linux线程退出详解:深入理解`pthread_exit`函数

本文深入解析Linux中的线程退出机制,重点剖析pthread_exit()函数。主要内容包括:线程退出的三种方式(自然退出、强制终止、主动退出);pthread_exit与exit、return的关键区别;函数工作机制及退出状态传递;实际应用案例展示线程池和错误处理中的使用场景。文章还提供了最佳实践建议,如避免在持有锁时调用pthread_exit,以及通过pthread_join实现线程同步。最后强调线程退出时的资源管理注意事项,帮助开发者正确使用该函数进行多线程编程。

软件科学-郝学胜 2057

Linux系统学习:线程

/把一个线程设置成相应的属性detachstate:有2个可选值,PTHREAD_CREATE_DETACHED--分离属性。2.push了,但是pthread_exit(NULL);

2301_80265108的博客 236
上一篇: Linux pthread_self和pthread_create函数
下一篇: Linux 线程同步
cslqm
博客等级 码龄11年 32粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值