现在的位置: 首页 > 综合 > 正文

死锁检测

2013年11月24日 ⁄ 综合 ⁄ 共 4585字 ⁄ 字号 评论关闭

曾经参与过的一款网络游戏,其服务器使用了异常复杂的多线程序解决方案。导致应用层程序员编写的代码很容易就出现死锁。

最终,公司的一个老员工,只能开发了一个死锁检测框架,在debug模式下运行时,只要发生死锁就会打印出调用堆栈。

虽然说这个框架基本可以在上线前把所有的死锁都检测了出来,但是,规根到底这是设计不合理造成的,多线程利用好了会提升

应用的效率,用不好的话,除了影响效率外,对上层开发简直是灾难。

 

下面说说那个检测方法,其实方法挺简单的。

有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。

每次加锁之前都会做如下检测:

 

1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来

2)遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求

 如果第二步返回真,表示出现了死锁

 

 

下面是简单的实现:

appMutex.h

 

 

appMutex.cpp

 

 

 

在两个线程中分别如下调用,就会看到死锁警告了

 

appMutex a("a");

appMutex b("b");

 

threada:

while(1)

{

a.lock();

Thread::sleep(1);

b.lock();

 

b.unlock();

a.unlock();

}

 

threadb:

 

while(1)

{

b.lock();

a.lock();

a.unlock();

b.unlock();

}

 

抱歉!评论已关闭.