Lamport的面包店算法

时间:2014-07-06 17:33:24

标签: 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) && (number[j],j)<(number[i],i))); 
     } 
     critical section 
     number[i] = 0; 
     remainder section 
    } while (1); 

我对这个算法有疑问,据说当你的数字为零时,你将无法进入临界区。

但是如果循环内的条件为真,循环的工作方式就会陷入所说的循环中。

意味着非零数字是那些没有达到临界条件的人吗?

这对我来说有点困惑,我很感激你的帮助

Greetins John。

1 个答案:

答案 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]设置为零,轮到您进入临界区。