当前位置: 首页 > ds >正文

C/C++死锁和活锁

1、定位程序卡死的步骤

        在我们程序调试过程中我们有时候会遇到程序卡死的情况,怎么定位程序的卡死呢,以下我总结了一些定位程序卡死的步骤:

1、先观察和重现,记录操作步骤、环境条件等信息,尝试复现问题2、然后检查硬件,存储器或者一些外设是否导致卡死3、软件调试,断点单步调试,增加一些必要过程日志,方便重启查看日志4、怀疑部分新增的代码模块或者外设导致,屏蔽此部分功能,验证是否还是会卡死5、检查资源管理,只要是是否有死锁情况,内存泄露的情况

2、死锁

我们这次重点说下死锁,那么什么情况下会出现死锁的情况

死锁的例子

假设有两个进程(Process)P1 和 P2,以及两个资源(Resource)R1 和 R2。

  1. P1 已经获得了 R1 的锁。
  2. P2 已经获得了 R2 的锁。
  3. P1 尝试请求 R2 的锁,但 R2 已经被 P2 占用,因此 P1 进入等待状态。
  4. P2 尝试请求 R1 的锁,但 R1 已经被 P1 占用,因此 P2 进入等待状态。

此时,P1 和 P2 都在等待对方释放资源,形成了一个死锁 

防止死锁最方便的方法:

  • 锁超时:为锁设置超时时间,避免进程无限期地等待锁 
  • 减少锁的范围:只在必要时才使用锁,并尽快释放锁 

3、活锁

出现活锁情况

  • 原因:活锁通常是由于进程之间的相互响应,导致它们不断地改变自己的状态,但始终无法满足执行条件
  • 例子:两个人迎面走来,都想给对方让路,但每次都向同一方向移动,导致两人始终无法通过

如何避免活锁

  • 引入随机性:在进程重试时引入随机延迟,避免进程之间的同步行为 
  • 优先级:为进程设置优先级,避免低优先级进程一直占用资源,导致高优先级进程无法执行
http://www.xdnf.cn/news/2539.html

相关文章:

  • k8s学习记录(五):Pod亲和性详解
  • 解决两个技术问题后小有感触-QZ Tray使用经验小总结
  • 分布式GPU上计算长向量模的方法
  • 数据一致性问题剖析与实践(四)——竞态条件竞争导致的一致性问题
  • 制作一款打飞机游戏26:精灵编辑器
  • streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发
  • Pikachu靶场-PHP反序列化漏洞
  • 2024ICPC网络赛第二场题解
  • DeepSeek:重构人类文明的智能引擎
  • JVM——运行时数据区
  • NLP预处理:如何 处理表情符号
  • 基于物理信息的神经网络在异常检测Anomaly Detection中的应用:实践指南
  • 解决Cline的Shell Integration Unavailable问题
  • 软考:软件设计师考试数据结构知识点详解
  • 引领印尼 Web3 变革:Mandala Chain 如何助力 1 亿用户迈向数字未来?
  • .class文件是字节码吗还是二进制文件
  • 【首款Armv9开源芯片“星睿“O6测评】SVE2指令集介绍与测试
  • Android调试那些事儿
  • uniapp-商城-42-shop 后台管理 分包
  • 多视觉编码器协同与高低分辨率特征融合技术综述
  • JVM——垃圾收集策略
  • 心形烟花优化展示效果
  • conda 常用命令
  • Docker:快速搭建 RabbitMQ 集群的技术指南
  • javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
  • 【HarmonyOS 5】鸿蒙检测系统完整性
  • STM32F103_HAL库+寄存器学习笔记21 - CAN接收过滤器:CPU减负神器,提升系统效率的第一道防线
  • Ubuntu 磁盘空间占用清理(宝塔)
  • 创建一个springboot的项目-简洁步骤
  • 利用 Python 爬虫按关键字搜索 1688 商品详情:实战指南