澄清两个线程之间的死锁

时间:2018-03-13 00:07:37

标签: operating-system deadlock

我想知道我对此问题的解决方案是否正确

  

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。

enter image description here

1 个答案:

答案 0 :(得分:0)

是的,你的解决方案是正确的。

另一种选择是任务B lockQ之前的lockP,而任务A 执行lockPlockQ }。但如果 B 获得Q A 获得P,则可能导致死锁。在这种情况下,两个任务都被阻止。

正如您所提到的,两者都以相同的顺序获取资源,确保一个被阻止而不会导致另一个阻止另一个资源。

Coffman,Elphick和Shoshani(1971)确定了发生死锁的四个条件[1],

  1. 互斥使用的共享资源
  2. 增量收购
  3. 没有先发制人(一旦获得,任务在完成工作之前不会放弃资源)
  4. 等待周期
  5. 您必须使其中一个条件无效,以确保不会发生死锁。通过确保两个任务以相同的顺序获取资源,您必须确保条件4不成立,即 A B 将永远不会保留资源并等待第二个资源同时。

    [1]:Magee,Kramer,并发状态模型& Java程序,第107页