原创 宋宝华 Linux阅码场 2019-11-15


有一次给一群码农演讲,我喷口水喷了快一个小时,说spinlock等的正确使用以及死锁的原因。下面有个人突然问,“老师,请问什么叫死锁?”。 我心里想,把这个人拉出去枪毙一万次 :-) ,你这样是怎么做了几年码农的?这样民族自强的机会在哪里?但是我还是耐心地跟他解答了。我跟他说:“死锁就是我们两约好一起去跳楼,然后我们都跑到了顶层88楼的天台,然后我跟你说一句,'you jump, I jump',你也跟我说一句'you jump, I jump',最后你特马也没jump,我特马也没jump,所以跳楼这个壮举就算是因为死锁而永久地搞不下去了。”然后我问他明白了没有,他说:“没听懂”。这个时候我狠不得把自己拉出去枪毙一万次...... 以上段子来源于真实事件,如有雷同,纯属巧合。哈哈哈哈。 言归正传,我们来看看死锁的几种形成原因。我认为起码有三种: 1.自己掉坑里了,这种我姑且简称自杀型。行动特征: 有人说,死锁不是两个人的事情吗?一个人也能自己把自己玩死?真的是可以的。最简单的自杀型就是在10号中断服务程序里面调用irq_disable(10),因为irq_disable()会执行一个同步,等正在执行的10号中断服务程序执行完,才继续disable 10号中断的动作。在10号中断服务程序里面调用irq_disable(10),等于在自己里面等自己结束,而自己结束又必须irq_disable(10)返回。 2.A等B做完某事才能继续,B也等A做完某事才能继续;这种我姑且称为互杀型。行动特征:

3.A等B做完某事才能继续,B等C做完某事才能继续,C等A做完某事才能继续;这种我姑且称为群殴型。行动特征:

互杀型应该是最简单也最容易理解的,我们先从互杀型开始。下面的代码演示中2个线程child1和child2,展示了最简单的互杀模型: