答案 0 :(得分:1)
不,如果您翻转订单,它就不起作用,因为它允许两个进程同时进入关键部分。
例如,假设一个初始状态为flag[0] = false, flag[1] = false, turn = 0
:
流程0运行:
turn = 1; // flag[0] = false, flag[1] = false, turn = 1
然后上下文切换到进程1:
turn = 0;
flag[1] = true; // flag[0] = false, flag[1] = true, turn = 0
while (flag[0] && turn == 0) {} // this evaluates to false because
// process 0 was interrupted before it set flag[0] to true
// Process 1 enters the critical section...
然后上下文切换回进程0:
flag[0] = true; // flag[0] = true, flag[1] = true, turn = 0
while (flag[1] && turn == 1) {} // this evaluates to false
// Process 0 enters the critical section..
现在两个流程都在关键部分内。
设置标志必须首先,因为它是其他进程无法覆盖的事情。如果进程设置turn
,那么如上所示,其他进程可以覆盖它,然后在第一个进程有机会设置标志之前进入临界区。