259
15
16
17
18
19
}
void csEnd ( int proc ) {
right = other ( proc );
wish[proc] = 0;
}
Алгоритм предусматривает, во-первых, общую переменную right
для представления номера процесса, который имеет преимущественное (но
не абсолютное) право на вход в критическую секцию. Во-вторых, массив
wish, каждый элемент которого соответствует одному из процессов и
представляет "желание" процесса войти в критическую секцию. Процесс
заявляет о своем "желании" войти в секцию (строка 7). Если при этом
выясняется, что процесс-конкурент не выставил своего "желания" (строка
9), то происходит возврат из функции, т.е. процесс входит в критическую
секцию независимо от того, кому принадлежало преимущественное право
на вход. Если же в строке 9 выясняется, что конкурент тоже выставил
"желание", то проверяется право на вход (строка 10). Если право
принадлежит нашему процессу, то повторяется проверка "желания"
конкурента (строки 8 - 10), пока оно не будет отменено. Конкурент
вынужден будет отменить свое "желание", потому что он в этой ситуации
перейдет к строке 11, где процесс, не имеющий преимущественного права,
должен это сделать. После отмены своего желания процесс ждет, пока
преимущественное право не вернется к нему (строка 12), а затем вновь
повторяет заявление "желания" и т.д. (строки 6 - 13). Таким образом,
процесс в функции csBegin либо повторяет цикл 7 - 14, либо выходит из
функции и входит в критическую секцию (10).
При выходе из критической секции (функция csEnd) процесс
передает преимущественное право входа конкуренту (строка 16) и
отказывается от своего желания (строка 17).