一道面试题目,请进
线程A和B,抢夺资源C和D,请给出一个发生死锁的例子,以及如何预防死锁的典型方案,再者,如何应用这个方案到实际中
分就这么多了,谢谢各位!
个人举一个丑陋的例子,不要见笑
C和D资源都作加锁操作
A抢到C资源, 通过要利用D资源,才能完成C操作,并对C解锁
B抢到D资源, 通过A抢到C资源后作某一操作,才能对D 进行 解锁
产生死锁
解决:
将C和D同时当着一个资源来加锁解锁,当然还有多它方法,看你具体c和D的资源和对其操作方式
[解决办法]
这里给你一个最简单的办法克服死锁:
抢占资源必须有顺序,就是说A和B抢占CD的时候,必须先抢占C,完事后释放C才能抢占D,这样就不会死锁。
[解决办法]
A: require C, then require D
B: require D, then require C
当A得到C,B得到D后,死锁了。
方案1:
A: require C, then require D
B: require C, then require D
方案2: CD看做以整体
A: require C and D
B: require C and D
[解决办法]
A抢到C资源,B抢到D资源,但是需要D资源才能完成C操作,需要C资源才能完成D操作,这样一来就产生死锁
解决:
将C和D作为一个模块整体加锁
[解决办法]
循环等待,银行家算法