Взаимное исключение (алгоритм Петерсона)

Я смотрю на алгоритм Петерсона (взаимное исключение для 2 процессов). Мой вопрос в том, что, если ни один процесс еще не вошел в критическую секцию, а P0 хочет войти в критическую секцию в первый раз, тогда флаг P1 будет ложным, так как же P0 войти в его критическую секцию? Условие входа P0 в критическую секцию зависит от нашего флага, чтобы P1 был истинным.

Код:

    //flag[] is boolean array; and turn is an integer
flag[0]   = false;
flag[1]   = false;
turn;

P0: flag[0] = true;
    turn = 1;
    while (flag[1] == true && turn == 1)
    {
        // busy wait
    }
    // critical section
    ...
    // end of critical section
    flag[0] = false;

P1: flag[1] = true;
    turn = 0;
    while (flag[0] == true && turn == 0)
    {
        // busy wait
    }
    // critical section
    ...
    // end of critical section
    flag[1] = false;

person user2122810    schedule 03.03.2013    source источник


Ответы (1)


Условие входа P0 в критическую секцию зависит от нашего флага, чтобы P1 был истинным.

Нет, это не так. Заявление...

while (flag[1] == true && turn == 1) { ... }

Занят, ожидая, пока флаг P1 перестанет быть истинным. То есть: P0 ждет, пока P1 покинет свою критическую секцию. Так как P1 еще не вошел в свою критическую секцию, P0 не ждет и входит в критическую секцию правильно.

person Roger Lipscombe    schedule 03.03.2013
comment
О, я понял, не видел часть ожидания, я думал, что там сказано while () {Критический раздел} Спасибо, что прояснили это, тупой с моей стороны., - person user2122810; 03.03.2013