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

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.mzph.cn/news/120151.shtml

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

相关文章

C++中invoke与function的区别

C invoke invoke是C17标准引入的一个函数模板,用来调用可调用对象(Callable Object,如函数指针、函数对象、成员函数指针等)并返回结果。 invoke提供了统一的调用语法,无论可调用对象的类型是什么,都可以…

一文讲明白阿里云ace认证的含金量!

《中国云计算行业洞察与人才分析》显示,云计算领域人才月均薪酬在1W元以上的占比高达93.7%,3万元以上占比仍达24.7%。 相比之下,云计算人才远超互联网人才薪酬平均线,反映出市场对于其专业技术人才的需求。 云计算架构师、云计算…

2016年亚太杯APMCM数学建模大赛B题化学元素对变形钢筋性能的影响求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 B题 化学元素对变形钢筋性能的影响 原题再现 热轧带肋钢筋通常被称为变形钢筋,它主要用于钢筋混凝土构件的骨架,在使用中需要一定的机械强度、弯曲和变形性能、制造焊接性。钢中的化学成分是影响热轧钢最终组织性能的基…

Go 命令大全:全面解析与实践

一、Go命令全列表 在这部分,我们将通过一个表格来快速浏览Go语言的所有内建命令及其基本功能。这些命令涵盖了从代码构建、测试,到依赖管理和其他工具等方面。 命令功能描述go build编译Go源文件go run编译并运行Go程序go get下载并安装依赖或项目go m…

使用Typecho搭建个人博客网站,并内网穿透实现公网访问——“cpolar内网穿透”

使用Typecho搭建个人博客网站,并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站,并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

使用DBSyncer实现增量Mysql到Mysql的数据同步_DBSyncer1.2.4版本---数据同步之DBSyncer工作笔记006

之前都是用来postgresql到mysql的同步,需要配置postgresql的复制槽,对于mysq来说,需要配置: mysql启用binlog: https://gitee.com/ghi/dbsyncer/wikis/%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E6%97%A5%E5%BF%97%E9%85%8D%E7%BD%AE%EF%BC%88%E6%95%B0%E6%8D%AE%E6%BA%90%EF%B…

【Linux】Centos yum源替换

YUM是基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 CentOS 8操作系统版本结束了生命周期(EOL)&#xff0…

[论文阅读]Point Density-Aware Voxels for LiDAR 3D Object Detection(PDV)

PDV Point Density-Aware Voxels for LiDAR 3D Object Detection 论文网址:PDV 论文代码:PDV 简读论文 摘要 LiDAR 已成为自动驾驶中主要的 3D 目标检测传感器之一。然而,激光雷达的发散点模式随着距离的增加而导致采样点云不均匀&#x…

sharepoint2016-2019升级到sharepoint订阅版

一、升级前准备: 要建立新的sharepoint订阅版环境,需求如下: 1.单服务器硬件需求CPU 4核,内存24G以上,硬盘300G(根据要迁移的数量来扩容大小等); 2.操作系统需要windows server 20…

yum--centos 和apt --ubuntu

centos安装软件 搜索语法:yum -y search 软件名称 安装软件前可以先去搜一下看看能用yum中有这个软件吗 安装语法:yum -y install 软件名称 写上 -y 意思是不用手动确认,直接安装 卸载语法:yum -y remove 软件名称 注…

Linux系列讲解 —— VIM配置与美化

目录 1. Vim基本配置2. 插件管理器Vundle2.1 下载Vundle2.2 在vimrc中添加Vundle的配置 3. Vundle的使用3.1 安装常用插件3.1.1 NERDTree 3.2 卸载插件 1. Vim基本配置 1.1 配置文件 vim的配置文件有两处,请根据实际情况选择修改哪个。 (1) 全局配置文件&#xff…

JVM相关的面试题

一、什么是程序计数器 二、简要的介绍一下堆 三、什么是虚拟机栈 四、能不能解释下方法区 五、你听过直接内存吗? 六、什么是类加载器,类加载器有哪些 七、什么是双亲委派模型 八、JVM为什么采用双亲委派机制 九、类装载的执行过程 十、对象什么时候被垃…

MATLAB中创建并计算多项式

目录 表示多项式 多项式的计算 此示例说明如何在 MATLAB 中将多项式表示为向量以及根据相关点计算多项式。 表示多项式 MATLAB 将多项式表示为行向量,其中包含按降幂排序的系数。例如,三元素向量 p [p2 p1 p0]; 表示多项式: 创建一个向量…

使用BufferWriter进行文件的写入操作

public class BufferedWirter_ {public static void main(String[] args) throws IOException {String filepath "e:\\ABC.txt";//创建BufferedWrite对象BufferedWriter bufferedWriter new BufferedWriter(new FileWriter(filepath,true));//BufferedWriter 并没有…

pycharm运行R语言脚本(环境安装)

文章目录 简介1. pycharm安装插件2. 安装R语言解释器2.1下载安装包2.2具体安装过程 3.编辑环境变量4.pycharm中配置安装好的R语言解释器 简介 pycharm 安装 R language for Intellij R language for Intellij 是一个插件,它为Intellij IDEA集成开发环境添加了对R语…

PowerPC T2080部分板卡产品介绍

T2080是NXP公司PowerPC T系列的中高端芯片,它具备4核8线程的E6500 高性能CPU核,同时具备8组10Gb和8组8Gb Serdes Lanes,Serdes可复用成SRIO、PCIE、XFI、SGMII接口,因此T2080具有很强的数据处理能力和广泛的总线互联能力。 科技的…

elementui时间日期组件右边自定义图标

效果 改为 首先是将左边的清除图标关闭 然后是将右边的图标设置为display:none,设置宽度,左右内边距 最后是 mounted() {/*思路:通过document文档,选中日期时间选择器元素,然后创建一个i标签,并指定其类…

OkHttp网络框架深入理解-SSL握手与加密

OkHttp简介 由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始HttpURLConnection的底层实现采用的是OkHttp。 特点: 支持HTTP/2并允许对同一主机的所有请求共享一个套接字通过连接池,减少了请求延迟…

ENSP模拟CE12800 SSH一键配置小工具

平时做自动化开发实验都是以SSH连接为基底的,经常做完一个实验新建实验又要去重新配置SSH,就会比较麻烦,所以自己做了个偷懒小工具分享给大家 使用方法: 1.小工具图 2.拓扑图 拓扑图 保证1/0/0口和云连接 3.小工具各个控件介绍 3.1 串口号:右键点击拓扑图中的12800交换机,…

Unity Shader Graph 风格化熔岩

Unity ShaderGraph 合集_哔哩哔哩_bilibili