游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c
全部博文(198)
分类: C/C++
2014-01-17 10:42:02
前不久在工作中遇到一个死锁的问题,特记录下。
假设有这样的一个场景, 你调用某个接口, 这个接口调用的过程中,会上两个读写锁,上锁的顺序是先A后B。然后在底层网络io回调的时候,也会使用到这两个锁,上锁的顺序是先B后A。 那么就存在这样一种情况。假如线程T1调用接口,刚上完A锁,还没有上B锁。底层回调线程T2刚上完B锁,还没有上A锁。这个时候,线程T1要申请上B锁,但是B锁已经被线程T2占用,无法成功,T1线程阻塞,无法及时将A锁释放,线程T2要申请上A锁,但是因为A锁被T1线程占用,这样T2线程也阻塞了,无法释放B锁。这样就出现相互等待对方释放锁资源的问题,从而死锁了。
解决这个问题的方法,可以有两种方法。
一、假如锁A和锁B实在同一个模块,我们可以使用递归锁代替读写锁,递归锁的特性就是,同一个线程可以进同一个锁多次, 不过要注意的是,锁A和锁B要使用相同的递归锁互斥对象