pthread_create()使用detach分离后仍有内存泄漏

news/2025/2/19 10:18:35/

使用pthread_create创建线程后使用valgrind测试有内存泄漏(环境Ubuntu 16.04-32bit, 16.04-64bit, 22.04-64bit):

先来看一下这个帖子:

pthread_create()使用detach分离后仍有内存泄漏_tunaG的博客-CSDN博客

 测试代码如下:

上面使用两种设置分离线程的方式,属性需不需要销毁(pthread_attr_destroy)对内存没影响,pthread注释或打开相应的代码可以进行测试:

结论如下:

1.不是分离式线程, 不调用pthread_join会有内存泄漏,valgrind显示pthread_create内会调用calloc申请堆内存,应该是在pthread_join中释放;另外pthread_join会阻塞等待对应的子线程结束 。

2.分离式线程调用pthread_join会出错,返回对应的错误值,当然pthread_create申请的内存也不能释放;理论上分离式进程会自己释放内存。

3.上面的内存之所以没有释放,可能是因为线程并未结束进程就直接退出了(这一点不确定,有知道的大佬可以在评论区留下宝贵意见),例如上面的例子,虽然使用pthread_cancel取消了线程,但是pthread_cancel只是发出取消请求,线程是不是响应取消(终止退出)由线程类型和状态决定,何时取消也要看是不是执行到了取消点默认线程的取消状态是可取消的,类型是延时取消,所以类似上例,取消线程后直接结束进程可能此线程还没来得及响应取消即还没终止,或还没来得及回收资源,所以内存会有泄露。

线程的取消可以参考linux man-pages:

pthread_cancel机翻:

PTHREAD_CANCEL (3)             Linux程序员手册                       PTHREAD_CANCEL (3)

名字

        Pthread_cancel -发送一个取消请求到线程

剧情简介

        # include < pthread.h >

        Int pthread_cancel(pthread_t线程);

        使用-pthread编译和链接。描述函数的作用是:向线程发送一个取消请求。目标线程是否以及何时响应取消请求取决于该线程控制下的两个属性:其可取消性状态和类型。

        线程的可取消状态由pthread setcancelstate(3)决定,可以启用(新线程的默认设置)或禁用。如果线程禁用了取消,那么取消请求将保持排队状态,直到线程启用取消。如果线程启用了取消,则其可取消性类型决定何时发生取消。

        线程的取消类型由pthread setcanceltype(3)决定,可以是异步的,也可以是延迟的(新线程的默认值)。异步可取消性意味着线程可以在任何时候被取消(通常是立即取消,但系统不能保证这一点)。延迟可取消性意味着取消将被延迟,直到线程下一次调用作为取消点的函数。在pthreads(7)中提供了一个函数列表,这些函数是或可能是取消点。

        当一个取消请求被执行时,线程将执行以下步骤(按此顺序):

        1. 取消清理处理程序被弹出(与它们被推送的顺序相反)并被调用。(见pthread_cleanup_push(3))。

        2. 特定于线程的数据析构函数以未指定的顺序被调用。(见pthread_key_create(3))。

        3.线程终止。(见pthread_exit(3)。)

        上述步骤是相对于pthread_cancel()调用异步发生的;pthread cancel()的返回状态仅仅通知调用者取消请求是否成功排队。

        在被取消的线程终止后,使用pthread_join(3)与该线程的连接将获得PTHREAD_CANCELED作为线程的退出状态。(与线程连接是知道取消已经完成的唯一方法。)

返回值

        如果成功,pthread_cancel()返回θ;当出现错误时,它返回一个非零的错误编号。

错误

        ESRCH  找不到ID为thread的线程。 

pthread_setcancelstate  和 pthread_setcanceltype

 

 机翻:

 PTHREAD_SETCANCELSTATE (3)Linux程序员手册PTHREAD_SETCANCELSTATE (3)

名字

        Pthread_setcancelstate、pthread_setcanceltype 设置可取消性的状态和类型

剧情简介

        # include < pthread.h >

        Int pthread_setcancelstate(Int state, Int *oldstate);

        Int pthread_setcanceltype(Int类型,Int *oldtype);

        使用-pthread编译和链接。

描述

        pthread_setcancelstate()将调用线程的可取消状态设置为state中给定的值。线程先前的可取消状态在oldstate所指向的缓冲区中返回。state参数必须具有以下值之一:

        PTHREAD_CANCEL_ENABLE线程是可取消的。这是所有新线程(包括初始线程)的默认可取消状态。线程的可取消性类型决定了可取消线程何时响应取消请求。

        PTHREAD_CANCEL_DISABLE该线程不可取消。如果收到取消请求,它将被阻塞,直到启用可取消性。

        pthread_setcanceltype()将调用线程的可取消性type设置为type中给定的值。线程的先前可取消类型在oldtype所指向的缓冲区中返回。类型参数必须具有以下值之一:

       PTHREAD_CANCEL_DEFERRED:取消请求被延迟,直到线程下一次调用作为取消点的函数(参见pthreads(7))。这是所有新线程(包括初始线程)的默认可取消类型。

        PTHREAD_CANCEL_ASYNCHRONOUS :线程可以在任何时候被取消。(通常,它将在收到取消请求后立即取消,但系统不能保证这一点。)这些函数中的每个函数执行的set-and-get操作相对于调用同一函数的进程中的其他线程来说是原子性的。

返回值

        如果成功,这些函数返回0;当出现错误时,它们返回一个非零的错误编号。

错误

        pthread_setcancelstate()可能会失败,并出现以下错误: EINVAL状态值无效。        

        pthread_setcanceltype()可能会失败,并出现以下错误: EINVAL类型无效值。


http://www.ppmy.cn/news/1079716.html

相关文章

【考研数学】概率论与数理统计 —— 第二章 | 一维随机变量及其分布(2,常见随机变量及其分布 | 随机变量函数的分布)

文章目录 引言三、常见的随机变量及其分布3.1 常见的离散型随机变量及其分布律&#xff08;一&#xff09;&#xff08;0-1&#xff09;分布&#xff08;二&#xff09;二项分布&#xff08;三&#xff09;泊松分布&#xff08;四&#xff09;几何分布&#xff08;五&#xff0…

剑指 Offer 11. 旋转数组的最小数字

剑指 Offer 11. 旋转数组的最小数字 二分 要注意的是&#xff0c;由于存在重复数字&#xff0c;所以初始状态可能不满足二分的性质。不满足的情况是&#xff1a;左边开始的数字和右边结束的数字相等&#xff0c;所以一开始要缩小右边界&#xff0c;让右边界的数字小于第一个数…

微服务-gateway基本使用

文章目录 一、前言二、gateway网关1、什么是微服务网关&#xff1f;2、微服务架构下网关的重要性2.1、没有网关2.2、有网关 3、gateway的功能4、gateway实战4.1、依赖配置4.2、添加网关配置4.3、添加网关启动类4.4、查看项目是否启动成功4.5、验证路由配置是否正确 三、总结 一…

【C++进阶】模板进阶

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

安防行业深度报告:技术创新与格局重构

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。通过运用云计算、人工智能等新技术&#xff0c;安防行业正经历从传统安防向 AI 智慧安防转型升级的过程。这种升级将改变传统安防只能事后查证、人工决策的劣势&#xff0c;使得全程监控、智能决策成为可能。通过运用后端云…

liunx下ubuntu基础知识学习记录

使用乌班图 命令安装使用安装网络相关工具安装dstat抓包工具需要在Ubuntu内安装openssh-server gcc安装vim安装hello word输出1. 首先安装gcc 安装这个就可以把gcc g一起安装2. 安装VIM3.编译运行代码 解决ubuntu与主机不能粘贴复制 命令安装使用 安装网络相关工具 使用ifconf…

【线程池】如何判断线程池中的任务执行完毕(三)

目录 前言 1. isTerminated()方法 2. awaitTermination()方法 3.getTaskCount()方法和executor.getCompletedTaskCount()方法结合使用 4.使用CountDownlatch类 前言 通常我们使用线程池的时候&#xff0c;系统处于运行的状态&#xff0c;而线程池本身就是主要为了线程复用&…

音频母带制作::AAMS V4.0 Crack

自动音频母带制作简介。 使用 AAMS V4 让您的音乐听起来很美妙&#xff01; 作为从事音乐工作的音乐家&#xff0c;您在向公众发布材料时需要尽可能最好的声音&#xff0c;而为所有音频扬声器系统提供良好的商业声音是一项困难且耗时的任务。AI掌握的力量&#xff01; 掌控您…