Нет, это не работает, если вы щелкаете заказы, потому что она позволяет оба процесса для входа в критический раздел одновременно.
Например, предположим, что начальное состояние, в котором 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
, то, как показано выше, другой процесс может перезаписать его, а затем ввести критический раздел, прежде чем первый процесс получит возможность установить флаг.