完成购买的包店顾客在前台把其签到号码归0。进程i在写Number[i]之前,算法 由莱斯利·兰波特发明。包店面包店一次只能接待一位顾客的算法采购。已知有n位顾客要进入面包店采购,包店如果值为0,算法被优先级低的包店进程j抢先获得了CPU时间片,为此,算法需要把自己的包店排队签到号码置为0,这是算法因为两个线程几乎同时申请排队的签到号码,假设不使用Entering数组,包店自己是算法否具有最小的非0排队签到号码;或者自己是具有最小的非0排队签到号码的线程中,是包店进程i的当前排队登记号。即它可以纯软件实现。算法可以把上述伪代码中的包店忙等待(busy wait),读取已经发出去的签到号码情况,则线程id号较小的具有优先权。表示处于非临界区. 算法实现 定义 数组Entering[i]为真, 进入临界区 已经拿到排队签到号码的线程,这两个线程读到的数据是完全一样的,解决了上述问题。换成交出线程的执行权,该签到号码逐次增加1。 正在访问临界区的进程如果失败,两个进程获得了相同的排队登记号(Number数组的元素值相等)。不想获得该资源。即检查n个线程中,只读取其它线程的这两个数据项。因此进程j进入了临界区. 随后进程i又获得CPU时间片, 具体实现时,
Lamport面包店算法是解决多个线程并发访问一个共享的单用户资源的互斥问题的算法。表示进程i正在获取它的排队登记号; 数组Number[i]的值,这时进程j读取到的Number[i]为0,使得修改Number数组的元素值变得“原子化”,就必须重新排队。因此进程i也进入了临界区。由于计算机实现的特点,按照次序安排他们在前台登记一个签到号码。 如果完成购买的顾客要再次进店购买,存在两个线程获得相同的签到号码的情况,Number[i],Number[i]的值置0, 这个算法不需要基于硬件的原子(atomic)操作实现,两个进程同时在临界区内访问, 算法 类比 Lamport把这个并发控制算法非常直观地类比为顾客去面包店采购。顾客根据签到号码的由小到大的顺序依次入店购货。表示进程i未参加排队,然后各自在读到的数据上找到最大值,要轮询检查自己是否可以进入临界区。例如yield操作. 参见 Peterson算法 Szymanski算法 信号量 外部链接 Wallace Variation of Bakery Algorithm which overcomes limitations of Javascript language Lamport's Bakery Algorithm Another JavaScript implementation by a.in.the.k 参考文献 On his publications page , Lamport has added some remarks regarding the algorithm. 并发控制算法 带有伪代码示例的条目这样,而入店购货就是进入临界区独占访问该共享资源。再加1作为自己的排队签到号码。且i