C/C++死锁和活锁
1、定位程序卡死的步骤
在我们程序调试过程中我们有时候会遇到程序卡死的情况,怎么定位程序的卡死呢,以下我总结了一些定位程序卡死的步骤:
1、先观察和重现,记录操作步骤、环境条件等信息,尝试复现问题2、然后检查硬件,存储器或者一些外设是否导致卡死3、软件调试,断点单步调试,增加一些必要过程日志,方便重启查看日志4、怀疑部分新增的代码模块或者外设导致,屏蔽此部分功能,验证是否还是会卡死5、检查资源管理,只要是是否有死锁情况,内存泄露的情况
2、死锁
我们这次重点说下死锁,那么什么情况下会出现死锁的情况
死锁的例子
假设有两个进程(Process)P1 和 P2,以及两个资源(Resource)R1 和 R2。
- P1 已经获得了 R1 的锁。
- P2 已经获得了 R2 的锁。
- P1 尝试请求 R2 的锁,但 R2 已经被 P2 占用,因此 P1 进入等待状态。
- P2 尝试请求 R1 的锁,但 R1 已经被 P1 占用,因此 P2 进入等待状态。
此时,P1 和 P2 都在等待对方释放资源,形成了一个死锁
防止死锁最方便的方法:
- 锁超时:为锁设置超时时间,避免进程无限期地等待锁
- 减少锁的范围:只在必要时才使用锁,并尽快释放锁
3、活锁
出现活锁情况
- 原因:活锁通常是由于进程之间的相互响应,导致它们不断地改变自己的状态,但始终无法满足执行条件
- 例子:两个人迎面走来,都想给对方让路,但每次都向同一方向移动,导致两人始终无法通过
如何避免活锁
- 引入随机性:在进程重试时引入随机延迟,避免进程之间的同步行为
- 优先级:为进程设置优先级,避免低优先级进程一直占用资源,导致高优先级进程无法执行