死锁 必然

问题:      写一个“必然”会出现死锁的一段代码,我面过很多人,他们写的都不是严格意义上的死锁,都被我挑出来很多刺。

一:

多线程的话可以用信号量 
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 ),你需要通过进程的等待完成类似任务。所以,看上面就行。

猜你喜欢

转载自www.cnblogs.com/fanguangdexiaoyuer/p/9082163.html