死锁是什么?如何避免?如何排查?为什么这样排查 详细总结

news2024/11/20 12:40:56

1.死锁是什么 

 多个线程访问资源 线程加锁不当 会造成死锁。导致所有线程被阻塞,且无法解开

2.死锁的产生原因

1.加锁后忘记解锁

2.重复加锁,造成死锁

3.B锁内部调用函数A ,A运行是又加锁     导致A,B均无法运行 

3.如何避免死锁

多检查

使用trylock 替换

通过互斥锁实现线程同步   --避免死锁

4.如何排查死锁

4.1.排查死锁逻辑顺序  为什么是那几个步骤

1.定位线程+代码行   需要找到哪行代码发生了死锁  因此需要找到出问题的线程

  thread 1 切换线程bt查看线程的堆栈调用)

2.全部线程   那么就需要先查看所有线程的堆栈调用情况  info thread

3.跟踪进程   使用attach 跟踪进程 sudo gbd attach 6586(进程号) 确定其中线程具体工作

4.确定是否死锁  查看具体进程内存占用 确定是否发生了死锁    top -Hp 6586

5.查看进程状态 确定进程号 ps aux | grep deadlock

4.2、具体排查顺序

1.找到执行的进程号  

2.通过内存判断是否是发生死锁 如果内存占用率和内存都是0 就可确定是死锁

3.跟踪进程  确定线程的具体工作

4.查看所有线程堆栈调用 定位线程

5.查看每个线程的堆栈调用  确定死锁的线程

6.确定后 通过vim查看

4.3详细排查死锁步骤

shell +gdb

1.使用 ps aux命令查看进程状态

首先查看cpu占用率和内存利用率 进程如果发成死锁会处于阻塞状态 因此基本不占用CPU,所以CPU利用率和内存占用率会比较低 可以使用 ps aux命令查看进程状态

ps aux | grep deadLock

 deadlock是文件名字

 第二个是 ps aux 的进程

第一个是排查进程

2.使用top查看CPU利用率和内存占用率
top -Hp 6586

可以看见,这个进程里面一共存在三个进程。仔细思考,应该是对应线程t1、t2、和 main进程。它们的CPU利用率、内存都是0,很有可能发生了死锁。.

3.attach跟踪这个进程

在实际的项目中,我们一般也不可能把一个进程停掉用GDB调试。

只能用GDB 的 attach 命令来跟踪这个进程

su  //超级权限
gdb attach 6586

由上所示 了解到线程1是main线程、线程2是t1、线程3是t2

4.info threads下一步单独查看每个线程的堆栈调用情况
info threads

 各个线程的索引

5.使用 thread + 线程索来切换到某个线程:
thread 1

6.使用 bt 来查看堆栈当前线程的堆栈调用:

没有锁相关调用因此死锁不在这个线程中

7.切换到别的线程 thread 2

在上面这张图中,从上往下看,找到进程名+行数的组合最后出现的地方,出现在程序的14行。我们用vim看一下程序的14行是什么:

8.thread 3

线程3在执行完进程的23行基本阻塞住了

可以看见,线程t2想拿锁A,但锁A在t1手里,所以它们俩循环等待对方先释放锁,造成了死锁。

排查结束

Linux下排除死锁详细教程(基于C++11、GDB)_gdb调试死锁_zsiming的博客-CSDN博客

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

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

相关文章

【vector题解】杨辉三角 | 删除有序数组中的重复项 | 只出现一次的数字Ⅱ

杨辉三角 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1…

操作系统【OS】死锁

常考点 系统资源不足不是系统产生死锁的原因,资源不足只会对进程造成“饥饿”【详见王道操作系统书P153第4题】 A:资源不足和资源分配不足还是有区别的啦~ 死锁是什么? 死锁是多个进程因为竞争资源而造成的一种互相等待 为什么会出现死锁&…

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 (1)原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…

Unity报错:Microsoft Visual C# Compiler version

Unity报错:Microsoft Visual C# Compiler version 问题解决方案总结 问题 Microsoft Visual C# Compiler version 2.9.1.65535 (9d34608e) Copyright © Microsoft Corporation 切换版本或者使用老项目的时候可能会出现这个报错,这个报错就是项目设置的问题 …

计算机起源(三)

一、前言 计算机在完成了硬件和操作系统的构建后,最重要的一件事情就是要处理数据。在现代意义的数据库出现之前(20世纪60年代),人们通过人工和文件系统的方式来存储、管理数据。在人工管理时期,人们常使用穿孔纸带来管理数据 ,虽…

华为机试题:HJ4 字符串分隔

目录 第一章、算法题1.1)题目描述1.2)解题思路与答案1.3)牛客链接 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1)题目描述 题目描述&…

前端html+css+js实现的2048小游戏,很完善。

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 逻辑用的是JavaScript,界面用canvas实现,暂时还没有添加动画。 视频浏览地址

mac安装并使用wireshark

mac安装并使用wireshark 1 介绍 我们在日常开发过程中,遇到了棘手的问题时,免不了查看具体网络请求情况,这个时候就需要用到抓包工具。比较著名的抓包工具就属:wireshark、fildder。我这里主要介绍wireshark。 2 安装 以mac安装为…

电压放大电路适用于什么场合(电压放大器)

电压放大电路是一种常见的电子电路,可将输入信号的电压放大到更高的水平,从而提高信号的强度和可靠性。它在各个领域都有广泛的应用,下面将介绍电压放大电路的适用场合。 电压放大电路广泛应用于音频领域。音频信号的传输和处理需要较高的电压…

你真的了解CPU和GPU?

目录 先举个栗子 CPU 什么是CPU CPU的定义 CPU的组成 CPU的功能 GPU 什么是GPU GPU的定义 GPU的组成 GPU的功能 CPU和GPU的区别 先举个栗子 假设你正在编辑一份文档,这时可以将CPU和GPU的角色比喻为文档编辑过程中的两个不同任务。 1. CPU CPU就好比是…

自动驾驶之—LaneAF学习相关总结

0.前言: 最近在学习自动驾驶方向的东西,简单整理一些学习笔记,学习过程中发现宝藏up 手写AI 1. 概述 Laneaf思想是把后处理放在模型里面。重点在于理解vaf, haf,就是横向聚类:中心点,纵向聚类&…

C语言之预处理

目录 前言 宏定义define的用法 文件包含include的用法 条件编译的用法 其他预处理命令 练习题 练习一 练习二 练习三 前言 预处理命令可以改变程序设计环境,提高编程效率,它们并不是C语言本身的组成部分,不能直接对它们进行编译&am…

竹云产品入选《2023年度上海市网络安全产业创新攻关成果目录》

为推进网络安全产业发展,建设网络安全产业创新高地,上海市经济和信息化委员会于10月24日正式发布《2023年度上海市网络安全产业创新攻关成果目录》,共评选出16项创新成果,其中包括基础技术创新8项、应用技术创新4项、服务业态创新…

源码推荐【源码好优多】

一、影视小程序 特点:可独立部署、消耗环境小、安全可靠。使用微信小程序技术开发。部署简单容易。该项目的部署需要具备微擎框架的开发以及部署能力 二、java博客管理系统 博客管理系统是一个融合线上、线下的网民在线交流管理信息化系统。它的使用为网民、运营者搭…

FineReport模版报错排查

在【智能运维——》平台日志——》模版报错】目录下可以查看在使用中有报错的模版,可在【下载日志】目录下下载具体时间断的日志进行报错分析。 常见报错 1、 11300003:com.fr.stable.DeathCycleException: pInvCode_sn 出现原因: 模版参数…

Linux 云服务器磁盘挂载简介

云服务器磁盘挂载 一、挂载须知 一般涉及工具或命令:fdisk/gdisk/parted等挂载(mounting)是指由操作系统使一个存储设备(诸如硬盘、CD-ROM或共享资源共享资源上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程。…

Linux ls命令:查看目录下文件

ls 命令,list 的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。此命令的基本格式为: [rootlocalhost ~]# ls [选项] 目录名称 ls 命令常用的选项以及各自的功能。 注意,当 ls 命令不使用任何选项时…

基于arduino uno + L298 的直流电机驱动proteus仿真设计

一、L298简介: L298是一个集成的单片电路,采用15个导线多瓦和PowerSO20封装。它是一个高电压、高电流双全桥驱动器,旨在接受标准TTL逻辑电平和驱动感应负载,如继电器、螺线管、直流和加速电机。提供两个使输入来使独立于输入信号的…

Vue---监听div元素宽高改变时echart图表重新resize

一、需求描述 当点击上图的红色框时,echart的div元素宽会改变但是无法触发echarts图表的resize重新渲染,对于浏览器而言,浏览器具有window.resize方法监听浏览器窗口大小的改变,而div元素没有监听宽高改变的方法。 二、解决方案 …