Synchronization 过程同步的烘焙算法 do{ 选择[i]=true; 编号[i]=最大值(编号[0],编号[1],…,编号[n–1])+1; 选择[i]=false; 对于(j=0;j编号[i]。 在第一种情况下,线程i和j同时运行其for循环;其中只有一个线程将赢得(编号[j],j)以上是关键解决方案的入口和出口部分 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]); // while ((number[j]!= 0) && (number[j],j)<(number[i],i))); } critical section number[i] = 0; remainder section } while (1); thread 1 thread 2 //choosing[1]=true 1.tmp1 = number[1] 1.tmp2 = number[2] //choosing[2]=true 2.tmp1 = number[1] 2.tmp2 = number[2] number[2] = max(2.tmp1,2.tmp2)+1 = 1 //choosing[2]=false //while (choosing[1]) {} while (number[1]≠0 && (number[1],1)<(number[2],2)) {} critical section ... number[1] = max(1.tmp1,1.tmp2)+1 = 1 //choosing[1]=false //while (choosing[2]) {} while (number[2]≠0 && (number[2],2)<(number[1],1)) {} critical section ... critical section ...

Synchronization 过程同步的烘焙算法 do{ 选择[i]=true; 编号[i]=最大值(编号[0],编号[1],…,编号[n–1])+1; 选择[i]=false; 对于(j=0;j编号[i]。 在第一种情况下,线程i和j同时运行其for循环;其中只有一个线程将赢得(编号[j],j)以上是关键解决方案的入口和出口部分 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]); // while ((number[j]!= 0) && (number[j],j)<(number[i],i))); } critical section number[i] = 0; remainder section } while (1); thread 1 thread 2 //choosing[1]=true 1.tmp1 = number[1] 1.tmp2 = number[2] //choosing[2]=true 2.tmp1 = number[1] 2.tmp2 = number[2] number[2] = max(2.tmp1,2.tmp2)+1 = 1 //choosing[2]=false //while (choosing[1]) {} while (number[1]≠0 && (number[1],1)<(number[2],2)) {} critical section ... number[1] = max(1.tmp1,1.tmp2)+1 = 1 //choosing[1]=false //while (choosing[2]) {} while (number[2]≠0 && (number[2],2)<(number[1],1)) {} critical section ... critical section ...,synchronization,Synchronization,选择[i]时,当number[i]被更新为大于number数组中的所有其他值(线程正在获取的新票证值)时,选择[i]为真。在for循环体中,代码首先等待选择[j]为false,表示线程编号j已经选择了这一轮的票证。如果线程j继续执行,而线程i还没有进入临界区,则编号[i]不会更改,因此: 如果线程j仍在同一轮中,并且尚未完成关键部分,则数字[j]是max计算的结果,该计算可能考虑到也可能没有考虑数字[i]的当前值,具体取决于线程i和j的执行交错。 如果螺纹j位于余数部分,则编号[j]为0。 如果

选择[i]时,当number[i]被更新为大于number数组中的所有其他值(线程正在获取的新票证值)时,选择[i]为真。在for循环体中,代码首先等待选择[j]为false,表示线程编号j已经选择了这一轮的票证。如果线程j继续执行,而线程i还没有进入临界区,则编号[i]不会更改,因此:

如果线程j仍在同一轮中,并且尚未完成关键部分,则数字[j]是max计算的结果,该计算可能考虑到也可能没有考虑数字[i]的当前值,具体取决于线程i和j的执行交错。 如果螺纹j位于余数部分,则编号[j]为0。 如果线程j已经开始新一轮,那么它的编号[j]是考虑编号[i]当前值的max计算的结果,因此编号[j]>编号[i]。
在第一种情况下,线程i和j同时运行其for循环;其中只有一个线程将赢得(编号[j],j)以上是关键解决方案的入口和出口部分
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]); // 
     while ((number[j]!= 0) && (number[j],j)<(number[i],i))); 
     } 
     critical section 
     number[i] = 0; 
     remainder section 
    } while (1); 
thread 1                                   thread 2
//choosing[1]=true
1.tmp1 = number[1]
1.tmp2 = number[2]
                                           //choosing[2]=true
                                           2.tmp1 = number[1]
                                           2.tmp2 = number[2]
                                           number[2] = max(2.tmp1,2.tmp2)+1 = 1
                                           //choosing[2]=false
                                           //while (choosing[1]) {}
                                           while (number[1]≠0 &&
                                                  (number[1],1)<(number[2],2)) {}
                                           critical section ...
number[1] = max(1.tmp1,1.tmp2)+1 = 1
//choosing[1]=false
//while (choosing[2]) {}
while (number[2]≠0 &&
       (number[2],2)<(number[1],1)) {}
critical section ...
                                           critical section ...