我想知道我对此问题的解决方案是否正确
ThreadA和ThreadB都需要资源P和Q才能完成一些工作。每个线程都可以使用lockQ()或lockP()获取资源。资源无法共享。如果任务尝试获取已在使用的资源,则会阻止。当一个Task不再需要它拥有的资源时,它可以使用unlockP()或unlockQ()释放它。
每个任务都运行自己的代码,并使用函数lockP(),lockQ(),doWork(),unlockP()和unlockQ()。每个线程在调用“doWork()”后释放其资源;资源按照获得的相反顺序发布。显示每个线程的一系列操作,以便无法实现死锁。
解决方案:
任务A
lockP();
lockQ();
的doWork();
unlockQ();
unlockP();
任务B
lockP();
lockQ();
的doWork();
unlockQ();
unlockP();
我首先锁定P和Q的原因是因为如果处理器首先执行TaskA,TaskB将被阻止。这将允许TaskA完成执行,然后转到将解除阻止的TaskB。
答案 0 :(得分:0)
是的,你的解决方案是正确的。
另一种选择是任务B 到lockQ
之前的lockP
,而任务A 执行lockP
和lockQ
}。但如果 B 获得Q
而 A 获得P
,则可能导致死锁。在这种情况下,两个任务都被阻止。
正如您所提到的,两者都以相同的顺序获取资源,确保一个被阻止而不会导致另一个阻止另一个资源。
Coffman,Elphick和Shoshani(1971)确定了发生死锁的四个条件[1],
您必须使其中一个条件无效,以确保不会发生死锁。通过确保两个任务以相同的顺序获取资源,您必须确保条件4不成立,即 A , B 将永远不会保留资源并等待第二个资源同时。
[1]:Magee,Kramer,并发状态模型& Java程序,第107页