bool in_critical[2] = {false,false};
int turn;
enter(int me, int other) {
(S1:) in_critical[me] = true;
(S2:) turn = other;
while(in_critical[other] && (turn == other)) ;
}
exit(int me) {
in_critical[me] = false;
}
выше простая реализация алгоритма Петерсона.
В разных онлайн-ресурсах говорится, что перед while(..)
требуется ограничение памяти, чтобы предотвратить проблемы с out-of-order execution
. Таким образом, порядок S1 and S2
не меняется.
Но я не могу определить точное созвездие, в котором это могло бы стать проблемой. Итак, мой вопрос: в каком именно переупорядочивании может возникнуть проблема?
Или, если это больше связано с проблемами согласованности. Так что, возможно, in_critical[me]
никогда не будет записан, и оба процессора могут просто использовать его внутри (регистр процессора никогда не записывается в кеш). В этом случае оба процессора попадут в критическую секцию. И забор памяти заставил бы сделать in_critical[me]
видимым.