代码之家  ›  专栏  ›  技术社区  ›  Sumeet

僵局与互斥

  •  0
  • Sumeet  · 技术社区  · 10 年前

    两个进程X和Y需要访问关键部分。考虑两个进程使用的以下同步构造。

    http://d18khu5s3lkxd9.cloudfront.net//wp-content/uploads/2015/02/Q20.png

    在上面给出的链接中, varP和varQ是共享变量,都初始化为false。以下哪项陈述是正确的?

    1.所提出的解决方案防止了僵局,但不能保证相互排斥

    2.所提出的解决方案保证了相互排斥,但未能防止僵局

    3.提出的解决方案保证了相互排斥,防止了僵局

    4.提议的解决方案未能防止僵局,也无法保证相互排斥

    根据提问者的说法,第四个答案是正确答案。

    我想,它不能保证相互排斥,但它如何不能防止僵局?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Sumeet    10 年前

    我仔细研究了算法后才想到这个。

    假设进程Y使用了关键部分。因此,它必须将VarQ变量设置为false。

    现在,如果进程X尝试进入关键部分。除非进程Y也尝试进入,否则它永远无法进入。原因是条件while(varQ==true)将保持为false,除非进程Y尝试进入关键节,并在这样做时将varQ设置为true,而在离开关键部分(CS)之前,varQ已设置为false。

    因此,如我们所见,如果流程Y不尝试进入CS,流程X将被无限期阻止,关键部分也将闲置。

    但问题仍然是,缺乏饥饿自由是如何导致缺乏死锁自由的。在死锁中,每个进程都被阻止,但如果进程Y确实再次尝试进入CS,则进程X可能成功地尝试进入CS。