我已经阅读了几个关于互斥的例子,除了以下传给我的例子外,我能理解其中大多数的例子:
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])
条件,并且仍然可能出现竞争条件。我误解了什么?
答案 0 :(得分:1)
声明和定义
boolean[] flag = new boolean[2];
看起来像java,在java中,boolean数组填充false作为默认值。
因此,例如让P1进入它的关键部分 标志[0]和标志[1]都需要设置为真。
不是不是, P1 指向Critical Section
,唯一的是 P0 > strong>在 P1 进入Critical Section
之前不得执行。
flag[0] = true;
,默认情况下flag[0] = false
,循环条件while(flag[0])
将为false, P1 将进入临界区。
如果计划进程 P0 和 P1 ,则在相应的下一个语句之前为两个进程执行以下语句:
flag[0] = true; and flag[1] = true;
在这种情况下会发生死锁。