互斥示例中的不明确
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将进入临界区。
如果进程 P0 和 P1 的调度方式是为两个进程执行以下语句 在相应的下一条语句之前:
flag[0] = true; and flag[1] = true;
这样会出现死锁
我看过几个关于互斥的例子,我能理解其中大部分的 运行 除了下面这个递给我的例子:
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
.
flag[0] = true;
并且由于默认情况下flag[0] = false
,循环条件while(flag[0])
将为假并且P1将进入临界区。
如果进程 P0 和 P1 的调度方式是为两个进程执行以下语句 在相应的下一条语句之前:
flag[0] = true; and flag[1] = true;
这样会出现死锁