互斥示例中的不明确

Unclearance in mutual exclusion example

我看过几个关于互斥的例子,我能理解其中大部分的 运行 除了下面这个递给我的例子:

boolean[] flag = new boolean[2]; 

一个while条件取决于另一个进程的flag[n]状态。 因此,例如,为了让 P1 进入它的临界区,flag[0]flag[1] 都需要设置为 true

根据我的理解,整个 运行 必须如下所示:

P1 - > flag[1] = true
while(flag[0])            // flag[0] is still state-undeclared
P2  -> flag[0]  = true    // so P0 must set it true(?)
critic1(); 
while(flag[1]) 
critic2(); 

虽然这不可能是正确的,因为将 flag[0]flag[1] 设置为 true 两个进程都通过了 while(flag[n]) 条件并且竞争条件仍然可能发生。我误会了什么?

声明和定义

boolean[] flag = new boolean[2]; 

看起来像 java,而在 java 中,布尔数组填充了 false 作为默认值。

So in order to for example have P1 heading into it's critical section both flag[0] and flag[1] need to be set true.

不,情况并非如此,因为 P1 将进入 Critical Section,唯一的问题是以下内容在 P1 进入 Critical Section.

之前,不得执行 P0 语句
flag[0] = true;

并且由于默认情况下flag[0] = false,循环条件while(flag[0])将为假并且P1将进入临界区。

如果进程 P0P1 的调度方式是为两个进程执行以下语句 在相应的下一条语句之前:

flag[0] = true; and flag[1] = true;

这样会出现死锁