关键部分第二次尝试?

时间:2011-12-28 11:57:53

标签: concurrency deadlock critical-section

以下互斥问题的算法不满足互斥属性。它是否满足了僵局,饥饿?并且在没有争用的情况下它是否正常运行?

int p=1;
int q=1;

process P                                    process Q
while(true){                                 while(true){
 a1 : nonCriticallSection1;                  a2 : nonCriticallSection1;
 b1 : while (q !=1){ do nothing}             b2 : while (p !=1){ do nothing}
 c1 : p=0;                                   c2 : q=0;
 d1 : critical section                       d2 : critical section
 e1 : p=1;                                   e2 : q=1;
  }                                            }
 end P;                                      end Q;

1 个答案:

答案 0 :(得分:0)

你的算法应该可以解决僵局,饥饿和争用 但是,这种解决方案不具备可扩展性,仅适用于可能不是您要查找的2个流程 您可以查看wikipedia'e entry for deadlock以找到一些有用的算法。

编辑:当你设置一个进程想要进入关键部分的进程标志时,我无法进行标记。因此,如果进程P拥有临界区但进程Q想要进入,那么当P结束临界区时它将会这样做,因为即使cheduler将选择重新执行P,P本身也将检查q == 0是否会等待它等待。
当然,你的例子是研究案例。它不适用于实际应用,因为它使用轮询和可能无限循环。我强烈建议不要尝试使用它。