#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]
равными нулю, наступает ваша очередь входить в критическую секцию.