如何查找死锁问题

来源:互联网 发布:成都cnc编程招聘 编辑:程序博客网 时间:2024/06/05 04:45
多线程编程,难免会遇到死锁问题,那么如何解决死锁问题呢?

首先了解一下死锁产生的原因:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁:
(1).按同一顺序访问对象。(注:避免出现循环)
(2).避免事务中的用户交互。(注:减少持有资源的时间,减少锁竞争)
(3).保持事务简短并处于一个批处理中。(注:同(2),减少持有资源的时间)
(4).使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)
(5).使用基于行版本控制的隔离级别:

方法一:
可以定义两个全局变量,lock_nu和unlock_nu,然后在每一个上锁的地方加上打印

fprintf(stderr,"[%s:%s:%d]:**********lock_nu=%d****** \n",__FILE__,__FUNCTION__,__LINE__,lock_nu++);

同理,在每一个解锁的地方加上 fprintf(stderr,"[%s:%s:%d]:**********unlock_nu=%d****** \n",__FILE__,__FUNCTION__,__LINE__,unlock_nu++);
这样当遇到死锁时,通过对比两个变量的值是否相等就可以大致知道哪里没有解锁或上锁。抑或是每一把锁设置一个全局变量,则这样就可以更准确地知道死锁的位置了。
方法二:
在可能发生死锁的位置记录时间,当超过一定时间仍无法获得全部资源,则认为发生死锁。这种情况下强制释放已经占用的资源(如果已经对资源进行了处理,记得要回滚),重新申请。
这么做的好处是可以有效解决已经发生的死锁。
缺点是只有在某些特点条件下才能使用这种方式,同时这么做对性能等也会产生影响,并增加代码的复杂度。

0 0
原创粉丝点击