定位死锁位置(跨平台)

死锁产生

死锁是如此产生的,以下内容引用一个 Linux 上分析死锁的简单方法

死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系?统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
一种交叉持锁死锁的情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其它线程占用并堵塞了的资源。例如,如果线程 1 锁住了记录 A 并等待记录 B,而线程 2 锁住了记录 B 并等待记录 A,这样两个线程就发生了死锁现象。在计算机系统中 , 如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

产生死锁的四个必要条件
(1) 互斥条件:一个资源每次只能被一个进程(线程)使用。
(2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

如何定位

上面的博客介绍了如何在Linux平台上如何定位死锁。我这里提供了另一种思路,可以在任何平台上使用。我通过这样的方式解决了项目中存在的各种死锁问题,写一个宏只在调试阶段才使用。

  • 简单来说死锁的产生就是多个线程需要相互拿已经被其他线程持有的锁

  • 所以思路就是在每次获取锁之前和释放锁之后的位置做一下记录,记录获取/释放此锁的线程、文件名和行号。获取以后存入一个队列中,释放以后从队列中移除。

  • 用一个独立的线程隔一段时间扫描一遍队列,如果产生死锁,那么队列里面剩下的位置就是产生死锁的位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章