LINUX.ORG.RU

Программируем критическую область (теория)


0

1

Короче, прочитал у Танненбаума (Э. Танненбаум, Современные Операционные Системы, 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--;
}


Мне кажется, что этот код гарантирует ожидаемое поведение (если пренебречь производительностью), а как думаете вы? Как бы вы это реализовали? Как бы доказывали гарантию?

Ответ на: комментарий от gandjubas

> Что-либо другое - ошибка реализации механизма многопоточности.

Ну или не ошибка, а следующее. Эффективная реализация «причинно-следственной связи» настолько дорога, что разработчики аппаратно-программных систем вправе заявить: вот у нас есть механизмы А, Б и Ц для синхронизации потоков, пользуйтесь только ими, а не самопалом, если хотите получить предсказуемый результат.

gandjubas
() автор топика
Ответ на: комментарий от gandjubas

> Эффективная реализация «причинно-следственной связи» настолько дорога

Вот именно. Фактический порядок записи в память различных переменных может изменяться согласно модели памяти, реализуемой данной архитектурой. Поэтому он будет отличаться от того порядка, который записан у вас в коде. И поэтому тот алгоритм, что вы привели, не работает, так как он рассчитан на строгую модель памяти.

bvvv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.