它是一种实现多进程互斥的软件算法。
该算法的基本思想源于顾客在面包店中购买面包时的排队原理. 顾客在进入面包店前, 首先抓一个号, 然后按照号码由小到大的次序依次进入面包店购买面包. 这里, 面包店发放的号码是由小到大的, 但是两个或两个以上的顾客却有可能得到相同的号码(使所抓号码不同需要互斥), 如果多个顾客抓到相同的号码, 则规定按照顾客名字的字典次序进行排序, 这里假定顾客是没有重名的. 在计算机系统中, 顾客就相当于进程, 每个进程有一个唯一的标识, 我们用P的下面加一个下标来表示. 例如: 对于 Pi和Pj, 如果有i<j, 则先为Pi服务, 即Pi先进入临界区.
该算法的实现需要如下两个数据结构:
int choosing[n];
int number[n];
choosing[n] 表示进程是否正在抓号,正在抓号的进程choosing[i]为1,否则为0, 其初值均为0.
number[n] 用来记录各个进程所抓到的号码, 如number[i]为0, 则进程Pi没有抓号, 如number[i]不为0, 则其正整数值为进程Pi所抓到的号码, 其初值均为0.
为了方便起见, 我们定义下述表记法:
● (a,b)<(c,d) 表示: 若a<c 则 整个表达式为真;若a==c且b<d则 整个表达式为真。
● max(a0,…,an-1) 其值为一正整数k, 对于所有i, 0≤i≤n-1, k