pthread多线程: 线程泄漏的检测

news2025/2/25 12:22:42

文章目录

    • 1. 目的
    • 2. 什么是线程泄漏
    • 3. pthread 线程泄漏例子
      • 3.1 代码
      • 3.2 编译和运行
      • 3.3 简要分析
    • 4. 检测线程泄漏
      • 4.1 编译链接时传入参数 `-fsanitize=thread`
      • 4.2 确认 TSAN_OPTIONS 环境变量
    • 5. 修复线程泄漏
      • 5.1 方法1: 主线程等待子线程
      • 5.2 方法2:子线程主动脱离主线程

在这里插入图片描述

1. 目的

线程泄漏是使用多线程时容易出现的一个错误, 这和内存泄漏有点像:操作系统为创建过程消耗了资源,但没有回收, 如果频繁的创建那么系统被严重拖累, 新申请线程或内存的成功概率降低。

2. 什么是线程泄漏

使用 pthread 实现多线程任务调度时, 子线程是从主线程创建的, 如下两种情况都满足时,会产生线程泄漏:

  • 子线程执行的函数中没有显式的销毁子线程 (未执行 pthread_detach()
  • 主线程中也没有等待子线程的结束 (未执行 pthread_join()

3. pthread 线程泄漏例子

3.1 代码

这里简单起见, 线程函数 f() 采用极简方式设定:传空指针参数, 只打印一句话和返回空指针。

// 这是一个反面例子。

#include <cstddef>
#include <pthread.h>
#include <stdio.h>

void* f(void*)
{
    printf("Hello from thread function f\n");
    return NULL;
}

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, f, NULL); // 主线程里开启子线程 t
    printf("This is main thread\n");

    return 0;
}

3.2 编译和运行

zz@Legion-R7000P% clang++ leak_example.cpp

第一次运行

zz@Legion-R7000P% ./a.out 
Hello from thread function f
This is main thread

第二次运行

zz@Legion-R7000P% ./a.out
This is main thread

3.3 简要分析

由于主线程(main()函数)没有等待子线程的结束, 程序运行可能出现的情况有两种:

  • 打印了子线程的内容
  • 没打印子线程的内容

以上两种结果都可能出现, 不能认为能出现正确结果就万事大吉了, 需要严格确保结果的正确性。

4. 检测线程泄漏

使用 ThreadSanitizer 可以检查 Pthread 的内存泄漏。需要的步骤如下

4.1 编译链接时传入参数 -fsanitize=thread

clang++ leak_example.cpp -fsanitize=thread

4.2 确认 TSAN_OPTIONS 环境变量

第一种: TSAN_OPTIONS 环境变量为空。
第二种: 设定为检测线程泄漏: export TSAN_OPTIONS="report_thread_leaks=1"

以上两种情况,都可以让线程泄漏的问题在程序运行阶段被报告出来。
而如果设定了 export TSAN_OPTIONS="report_thread_leaks=0", 则无法报告线程泄漏问题。

5. 修复线程泄漏

5.1 方法1: 主线程等待子线程

#include <cstddef>
#include <pthread.h>
#include <stdio.h>

void* f(void*)
{
    printf("Hello from thread function f\n");
    return NULL;
}

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, f, NULL); // 主线程里开启子线程 t

    pthread_join(t, NULL); // 主线程等待子线程 t 的结束

    return 0;
}

5.2 方法2:子线程主动脱离主线程

用到了 pthread_detach() 这个 API:

在这里插入图片描述
应用到代码中:

#include <cstddef>
#include <pthread.h>
#include <stdio.h>

void* f(void*)
{
    pthread_detach(pthread_self()); // 子线程主动 detach
    printf("Hello from thread function f\n");
    return NULL;
}

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, f, NULL); // 主线程里开启子线程 t

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561405.html

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

相关文章

k8s网络如何连接?

在k8s中网络连接可以分为 容器与容器: 所有在pod中的容器表现为在同一个host&#xff0c;他们之间可以通过端口进行连接 pod与pod: 因为每个pod都有一个ip&#xff0c;因此pod可以通过ip进行直接连接 在不同主机上pod究竟是如何连接的呢&#xff1f;毕竟pod ip只是虚拟的&…

Vue+Element-ui实现表格导出和导入

表格导出&#xff0c;填写数据&#xff0c;导入表格 需求&#xff1a;表格导出&#xff0c;填写数据&#xff0c;导入数据表格文件存储在前端表格文件不存储 需求&#xff1a;表格导出&#xff0c;填写数据&#xff0c;导入数据 分析需求&#xff1a; &#xff08;1&#xff0…

【Leetcode60天带刷】day01——704.二分查找、27.移除元素

题目&#xff1a; 704. 二分查找 Leetcode原题链接&#xff1a;力扣704.二分查找 思考历程与知识点&#xff1a; 考查二分查找能力&#xff0c;注意mid的取值。 注意&#xff1a; 右端点的大小&#xff0c;需要在数组长度上-1。也就是nums.size()-1&#xff0c;因为下标是从…

chatgpt赋能Python-python_numpy_转置

Python Numpy 转置 - 高效处理数据的必备技巧 作为一名专注于Python编程的工程师&#xff0c;你可能已经知道了 Python 编程语言的优雅以及Numpy 库的高效操作。在进行数值计算和数据处理方面&#xff0c;Numpy 库已成为 Python 可以与其他编程语言匹敌的主要原因之一。其中一…

Vue 3 第二十二章:组件十(组件高级特性-组件的渲染函数和JSX/TSX语法)

文章目录 1. 渲染函数2. JSX / TSX 语法2.1. 基本使用2.2. 使用 vue 中的语法2.2.1. {} 语法2.2.2. v-model 使用2.2.3. v-show 使用2.2.4. v-if 不支持&#xff0c;实现v-if功能2.2.5. v-for 不支持&#xff0c;实现 v-for 功能2.2.6. v-bind 不支持&#xff0c;模拟 v-bind2.…

AWD竞赛全流程解析

AWD(Attack With Defense&#xff0c;攻防兼备)是一个非常有意思的模式&#xff0c;你需要在一场比赛里要扮演攻击方和防守方&#xff0c;攻者得分&#xff0c;失守者会被扣分。也就是说&#xff0c;攻击别人的靶机可以获取 Flag 分数时&#xff0c;别人会被扣分&#xff0c;同…

汇编十三、串口

1、通信相关概念 (1)单工&#xff1a;只能接收或只能发送数据。 (2)半双工&#xff1a;既能发送数据&#xff0c;也能接收数据&#xff0c;但不能同时进行。 (3)全双工&#xff1a;可以同时进行发送和接收数据。 (4)单片机中常用的通信物理接口&#xff1a;I2C、SPI、USB、…

tushare单个股票过去五年的数据整理与预测

文章目录 前言&#xff1a;1. 导入相关包2. 数据预处理3. 构建模型3. 模型训练4. 检查数据6. 工作中其他常用包记录 前言&#xff1a; %md 在量化投资中&#xff0c;计算收益率是更常见的做法&#xff0c;而不是仅计算股价。计算收益率可以更好地反映投资的回报情况&#xff0c…

Pinctrl子系统_01_Pinctrl子系统介绍

本节介绍在Pinctrl子系统中&#xff0c;将会学习哪些内容。 Pinctrl作用 Pinctrl&#xff1a;Pin Controller&#xff0c;顾名思义&#xff0c;就是用来控制引脚的。 一个芯片有成百上千个引脚&#xff0c;这些引用要怎么配置&#xff0c;配置成什么功能&#xff0c;都是通P…

python+django网上书籍商城小说在线阅读分享下载系统k19is-vue

为了解决用户便捷地在网上购物以及下载文件&#xff0c;本文设计和开发了一个网页小说阅读系统。本系统是基于 B/S架构设计&#xff0c;Dango框架 &#xff0c;Python技术的前台页面设计与实现&#xff0c;使用Mysql数据库管理来完成系统的相关功能。主要实现了管理员与用户的注…

ETSI TS-关于SCP80

描述 GPC_UICC Configuration_v2.0.pdf 中: 规范 ts_102.225v12.1.0 Secured packet structure for UICC based applications.pdf spi kic kid编码 7 TCP/IP 的实现 在发送安全数据包之前&#xff0c;发送实体应使用定义的推送机制打开 TCP/IP 连接 在 ETSI TS 102 226 [9] …

【MATLAB第34期】基于MATLAB的2023年棕熊优化算法BOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富

【MATLAB第34期】基于MATLAB的2023年棕熊优化算法BOA优化LSTM时间序列预测模型 优势明显&#xff0c;注释详细&#xff0c;绘图丰富&#xff0c;适合小白 一、代码优势 1.使用2023年棕熊算法BOA优化LSTM超参数&#xff08;学习率&#xff0c;隐藏层节点&#xff0c;正则化系数…

chatgpt赋能Python-python_numpy倒序

Python Numpy倒序&#xff1a;简介、使用和优势 简介 Python是一门功能强大的编程语言&#xff0c;提供了众多开源库&#xff0c;其中Numpy是其中最流行的之一。Numpy是Python中的一个数值计算库&#xff0c;提供了一个高效的数组对象和相应的数学函数。它是数据科学家和机器…

Thonny-适合初学者小白的开箱即用的轻量级 Python IDE

如果你是一位Python初学者小白,那最适合Thonny它了&#xff0c;如果不是初学者&#xff0c;请选择PyDev和Pycharm。 Thonny是一款面向初学者小白的轻量级 IDE&#xff0c;可以让初学者更好更快的入门上手 Python&#xff0c;而不致于在环境上浪费过多的时间。 取之 Python&…

chatgpt赋能Python-python_purple

Python Purple: 一个高效的Python IDE Python Purple是Python程序员们最需要的工具之一。它是一款高效的Python IDE&#xff0c;允许用户轻松地创建&#xff0c;编辑和协作开发Python代码。本文将涉及Python Purple的一些重要特点以及它如何提高编码质量和提高生产力。 介绍P…

【利用AI让知识体系化】TypeScript目标:扩展JavaScript能力

I. TypeScript 简介 TypeScript 的起源 TypeScript 的起源是由微软公司开发&#xff0c;其首席架构师是 Anders Hejlsberg。Anders 是 Delphi 和 C# 语言的创始人&#xff0c;于2012年从微软发布了 TypeScript。 TypeScript 诞生的原因是为了解决 JavaScript 的一些缺点&…

Nginx(四)

部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…

网络原理(六):http 协议(上)

目录 HTTP 协议是什么 抓包工具 Fiddler 的下载 使用Fiddler HTTP 请求 (Request) HTTP 请求格式 首行 请求头&#xff08;Header&#xff09; Cookie HTTP 协议是什么 还是老样子&#xff0c;在讲解http 之前我们先来了解以下什么叫做 http 。 HTTP&#xff08;Hyp…

使用百度 PaddleOCR对身份证识别的简单处理

一&#xff1a;引言 本文才用百度的PaddleOCR对身份证进行识别的处理&#xff0c;由于直接使用并未进行对跟多数据集进行训练&#xff0c;当前的效果是对非少数民族的身份证识别率可以达到85%以上&#xff0c;同时要求身份证图片是正面且相对清晰。否则效果不理想&#xff0c;本…

基于java的时间管理系统的设计与实现

背景 要设计一个时间管理系统&#xff0c;通过这个系统能够满足时间管理的管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;系统公告管理&#xff0c;用户管理&#xff0c;时间分类管理&#xff0c;事件数据管理&#xff0c;目标数据管理&#xff0c;用户日…