Предполагая, что нет другого кода, который может установить turn
в значение, отличное от 0 или 1, и предполагая, что единственное, что связано с переменной turn
, - это P0 и P1, тогда это решает свойство взаимного исключения. В частности, вы говорите, что turn
инициализируется равным 0. Это означает, что P1 не может войти в критическую секцию: он занят в цикле while (turn != 1)
и останется в этом цикле, пока что-то не установит turn == 1
. Учитывая наше предположение, что только P0 и P1 вносят изменения в turn
, это означает, что P1 не может войти в критическую секцию, пока P0 не установит turn
в 1. Таким образом, P0 немедленно выйдет из цикла while (turn != 0)
(поскольку turn
изначально равно 0) и безопасно войдет в критическую секцию. . Он знает, что P1 не может войти в свою критическую секцию, пока turn
не будет установлено в 1, и это произойдет только после того, как P0 покинет свою критическую секцию. Как только P0 установит turn
в 1, P0 застрянет в цикле while (turn != 0)
до тех пор, пока P1 не освободит его, так что теперь P1 находится в своей критической секции, а P0 не может быть в ней. И так далее.
Самый простой способ представить это — два человека и дубинка. Каждый из них соглашается ничего не делать (входить в свою критическую секцию), если не держит эстафету. Таким образом, у Человека 1 сначала есть дубинка, и он может делать что угодно, зная, что Человек 2 ничего не может сделать - у него нет дубинки. Как только Человек 1 закончил, он передает эстафету Человеку 2. Человек 2 теперь свободен делать все, что хочет, и он знает, что Человек 1 ничего не делает, а только ждет, пока ему вернут жезл.
person
Oliver Dain
schedule
04.11.2015