Код блокировки Петерсона, взятый из (немецкий) wikipedia:
# define FALSE 0
# define TRUE 1
# define N 2
int turn;
int interested[N];
void enter_region(int process)
{
int other;
other = 1 - process;
interested[process] = TRUE;
turn = other;
while (interested[other] == TRUE && turn == other) ;
}
void leave_region(int process)
{
interested[process] = FALSE;
}
Может кто-нибудь подумать о примере, где ошибка происходит без функции функции leave_region
?
N.B.: Я точно знаю, что требуется функция mfence в функции enter_region
.
Конечно. Это не требует особо необычной ситуации.
Предположим, что вычисление выполняется в CR, причем конечным действием является сохранение результата в памяти. Предположим далее, что вскоре после CR другой поток считывает целевую память с целью получения результата вычисления. Чтение не должно быть переупорядочено с помощью записи else, и будет получено неправильное значение. Чтобы избежать этого, при выходе из CR требуется mfence
(или другая инструкция, служащая барьером памяти).