问题: 写一个“必然”会出现死锁的一段代码,我面过很多人,他们写的都不是严格意义上的死锁,都被我挑出来很多刺。
一:
多线程的话可以用信号量
1 锁 A,2 锁 B
1 给 2 发信号,2 给 1 发信号
等到收到信号,1 锁 B,2 锁 A (这里,要等到对方同意才可以锁。比如:1现在锁A,通过信号量,要等2同意才可以锁B。所以就不存在当1速度快,同时锁AB)
因为各自没有取得锁前不会发出信号,因此收到信号就可以保证死锁
信号量可以使用操作系统的信号量,也可以使用原子变量简单实现
这不是一道考锁的题,而是一道考分布式系统事件排序的题 。
非重入锁重入就是保证死锁
二:
用睡眠并不会必然导致死锁,只是以非常高的概率导致而已。
一个简单的方法是这样:线程 1 把自己的 handle 存在全局变量的 1 里,然后启动线程 2 并获得其 handle,然后等待这个 handle (等线程 2 结束);线程 2 的惟一工作是等待线程 1 的 handle。很容易证明,无论怎样调度,一定会进入死锁。
在没有单进程多线程概念的操作系统(如传统 UNIX ),你需要通过进程的等待完成类似任务。所以,看上面就行。