Короче, прочитал у Танненбаума (Э. Танненбаум, Современные Операционные Системы, 2-е изд., Питер, 2002) на стр. 132 про Алгоритм Петерсона, расчитанный на 2 процесса. И вдруг мне стало интересно как это будет выглядеть для N > 2 процессов. Решил наваять свой велосипед. Получилось вот такое:
#define N 100
#define FALSE 0
#define TRUE 1
int other = 0;
int nobody = 0;
int in = 0;
int turn = 0;
int choose_me = 0;
int interested[N];
...
enter_region(int process){
in++;
turn = process;
if(FALSE == interested[other]){
nobody++;
while(turn == process){
if(1 == nobody && FALSE == interested[other]){
choose_me = process;
interested[process] = TRUE;
other = choose_me;
}
}
if(FALSE == interested[process]) {
nobody--;
interested[process] = TRUE;
}
while(other != process)
choose_me = process;
}
}
leave_region(int process){
interested[process] = FALSE;
in--;
if(in > 0){
turn = process;
while(process == choose_me);
other = choose_me;
}
nobody--;
}
Мне кажется, что этот код гарантирует ожидаемое поведение (если пренебречь производительностью), а как думаете вы? Как бы вы это реализовали? Как бы доказывали гарантию?