我的解决方案是否满足互斥要求?

时间:2015-11-04 18:31:13

标签: java mutex mutual-exclusion

我找到了一个在线互斥问题的解决方案,它有两个进程P0和P1。 (假设变量 turn 初始化为0)

volatile int turn;  

过程P0:

/* Other code */
  while (turn != 0) { } /* Do nothing and wait. */
  Critical Section /* . . . */
  turn = 1;
  /* Other code */

流程P1:

/*Other code*/
  while (turn != 1) { } /* Do nothing and wait. */
  Critical Section /* . . . */
  turn = 0;
  /* Other code */

此解决方案如何解决互斥问题?我完全不理解。

3 个答案:

答案 0 :(得分:1)

假设没有其他代码可以将turn设置为0或1以外的值,并假设唯一弄乱turn变量的是P0和P1,那么这确实解决了相互关系排除财产。具体来说,你说turn被初始化为0.这意味着P1无法进入临界区:它在while (turn != 1)循环中忙碌,它将保持在该循环中,直到某些东西设置{{ 1}}。假设我们假设只有P0和P1对turn == 1进行更改,这意味着P1无法进入临界区,直到P0将turn设置为1.因此P0将立即退出它的turn循环(因为while (turn != 0)最初为0)并安全地进入其临界区。它知道P1不能进入它的关键部分,直到turn设置为1并且只有在P0离开它的关键部分后才会发生。一旦P0将turn设置为1,P0将被卡在它的turn循环中,直到P1将其设置为空,所以现在P1在它的临界区中而P0不在其中。等等。

想到这一点的简单方法是两个人和一个击球手。他们每个人都同意不做任何事情(进入他们的关键部分),除非他们持有击球手。因此,人1首先拥有击球手,并且可以自由地知道人2不能做任何事情 - 他们没有击球手。一旦完成第1人,他们就将警棍交给第2人。第2人现在可以自由地做任何他们想做的事情,并且他们知道第1人无所事事,只是等待将警棍交还给他们。

答案 1 :(得分:0)

正如@JustinSteele所指出的,这绝对不能解决互斥问题。也许如果您将转向更改为布尔值,您可能会得到一个脏修复,因为布尔值只包含两个值。如果你想要一个更合适的方式提供互斥,我建议你看看互斥,信号量和条件变量。祝你好运!

答案 2 :(得分:0)

如果P0和P1都被执行,并且每个只执行一次,那么P0将在P1之前首先完全进入临界区。

就Java内存模型而言,该程序已正确同步,因为所有线程间操作都是易失性读写操作。因此,该程序是顺序一致的,易于分析。

或者,更具体地说,所有易失性读取和写入都是按顺序排列的(这与编程顺序一致);这个命令将保证关键部分的互斥性。

然而,这里存在严重的问题。如果P1首先到达,它必须等待P0,无论P0到达多晚。这是非常不公平的。并且,如果未执行P0,则P1无法前进。并且,如果执行P0且P1不执行,则P0不能再次进入临界区(它必须等待P1重置转弯)。这种锁定机制只允许严格的P0-P1-P0-P1 -...序列(除非这正是所希望的)

要解决这个问题,有Dekker的算法,Peterson的算法等。请看这篇文章 - https://cs.stackexchange.com/a/12632