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) && (number[j],j)<(number[i],i)));
}
critical section
number[i] = 0;
remainder section
} while (1);
我对这个算法有疑问,据说当你的数字为零时,你将无法进入临界区。
但是如果循环内的条件为真,循环的工作方式就会陷入所说的循环中。
意味着非零数字是那些没有达到临界条件的人吗?
这对我来说有点困惑,我很感激你的帮助
Greetins John。
答案 0 :(得分:0)
看看原始论文:
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) && (number[j],j)<(number[i],i)));
部分之前设置了它
根据定义,您也不可能陷入此等待循环(L2),因为该问题假定线程无法在关键部分崩溃。因此,一旦您等待的所有其他线程退出临界区并将其number[j]
设置为零,轮到您进入临界区。