Конечно, вы могли бы написать код, который бы генерировал необработанное исключение, но алгоритм предполагает, что исполняющий процесс всегда будет устанавливать свой флаг в false после выполнения критической секции.Следовательно, алгоритм Петерсона действительно проходит 3 теста для критических секций.
1) Взаимное исключение - flag [0] и flag [1] могут быть оба истинными, но поворот может быть только 0 или 1. Поэтому только один издва критических раздела могут быть выполнены.Другой вызовет ожидание.
2) Progress - Если процесс 0 находится в критической секции, то turn = 0 и флаг [0] равен true.После того, как он завершил свою критическую секцию (даже если что-то катастрофическое случается), он должен установить флаг [0] в false.Если процесс 1 находился в режиме ожидания вращения, теперь он будет освобожден как флаг [0]! = True.
3) Ожидание границы - если Процесс 1 ожидает, Процесс 0 может войти в свою критическую секцию только один раз, перед процессом1 дан зеленый свет, как объяснено в # 2.
Проблема с алгоритмом Петерсона состоит в том, что в современной архитектуре кэш-память ЦП может испортить требование взаимного исключения.Эта проблема называется когерентностью кэша, и возможно, что кэш, используемый процессами 0 на ЦП 0, устанавливает флаг [0] равным true, в то время как процесс 1 на ЦП 1 по-прежнему считает флаг [0] ложным.В этом случае обе критические секции вступят, и BANG ... не удастся взаимно исключить, и теперь возможны условия гонки.