我读过几个关于相互排斥的例子,除了下面给我的例子之外,我可以理解其中大多数例子的运行情况:
boolean[] flag = new boolean[2];
一个时间-条件取决于另一个进程的标记状态。因此,例如,为了让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])
条件,并且仍然会出现争用条件。我误会什么了?
发布于 2017-09-26 09:30:10
声明和定义
boolean[] flag = new boolean[2];
看起来像java,在java中,布尔数组中填充了false作为默认值。
因此,例如,为了让P1进入它的关键部分,需要将标志和flag1设置为true。
不,这不是,对于要进入Critical Section
的P1,唯一的问题是,在P1输入Critical Section
之前,不能执行P0的以下语句。
flag[0] = true;
由于默认情况下是flag[0] = false
,循环条件while(flag[0])
将为false,而P1将进入关键部分。
如果进程P0和P1的调度方式是在相应的下一个语句之前为两个进程执行以下语句
flag[0] = true; and flag[1] = true;
在这种情况下,将出现死锁。。
https://stackoverflow.com/questions/43309215
复制相似问题