Алгоритм пекарни Лэмпорта

#multithreading #algorithm #multiprocess

#многопоточность #алгоритм #многопроцессорность

Вопрос:

     do { 
     choosing[i] = true; 
   number[i] = max(number[0], number[1], …, number [n – 1]) 1; 
     choosing[i] = false; 
     for (j = 0; j < n; j  ) { 
     while (choosing[j]); // espera que j obtenha um bilhete 
     while ((number[j]!= 0) amp;amp; (number[j],j)<(number[i],i))); 
     } 
     critical section 
     number[i] = 0; 
     remainder section 
    } while (1); 
  

У меня есть сомнения по поводу этого алгоритма, предположительно, когда ваше число равно нулю, вы не сможете войти в критическую секцию.

Но способ, которым работает цикл, если условие внутри цикла истинно, вы застрянете в указанном цикле.

Это означает, что ненулевые числа не достигнут критического состояния, верно?

Это немного сбивает меня с толку, я был бы признателен за вашу помощь

Приветствую Джона.

Комментарии:

1. Добро пожаловать в SO. Пожалуйста, попробуйте форматировать свой код с лучшими отступами, чтобы сделать его более читаемым и, следовательно, сделать людей более склонными помогать вам.

Ответ №1:

Взгляните на оригинальную статью:

http://research.microsoft.com/en-us/um/people/lamport/pubs/bakery.pdf

(источник: http://research.microsoft.com/en-us/um/people/lamport/pubs/pubs.html#bakery)

Утверждение 2 подразумевает, что в критической секции в любой момент может находиться не более одного процессора. Утверждения 1 и 2 доказывают, что процессоры поступают в свои критические секции в порядке живой очереди. Следовательно, отдельный процессор не может быть заблокирован, если вся система не находится в тупике. Утверждение 3 подразумевает, что система может зайти в тупик только из-за остановки процессора в его критической секции или из-за неограниченной последовательности сбоев процессора и повторных входов.

Невозможно, чтобы ваш номер, т.е. number[i] , был равен нулю, когда вы достигнете критической секции, потому что вы единственный, кто записывает в нее, и потому что вы устанавливаете его до достижения секции цикла while ((number[j]!= 0) amp;amp; (number[j],j)<(number[i],i))); .

Вы также не можете застрять в этом цикле ожидания (L2) по определению, поскольку проблема предполагает, что поток не может завершиться сбоем в критической секции. Поэтому, как только все остальные потоки, которых вы ожидаете, выйдут из критической секции и установят их number[j] равными нулю, наступает ваша очередь входить в критическую секцию.