双标志先检查法:检查与上锁之间被切换
P0
while (flag[1]);
flag[0] = true;
critical section;
flag[0] = false;
P1
while (flag[0]);
flag[1] = true;
critical section;
flag[1] = false;
共享状态
flag[0]false
flag[1]false
临界区空闲
问题根源:先检查,再上锁;这两个动作不是原子操作。