真香收纳摊清洗地毯怎么过

2026-06-17 17:13:29休闲
已知有n位顾客要进入面包店采购,包店 算法 类比 Lamport把这个并发控制算法非常直观地类比为顾客去面包店采购。算法表示进程i正在获取它的包店排队登记号; 数组Number[i]的值,读取已经发出去的算法签到号码情况,规定这个数组元素的包店取值没有上界。只读取其它线程的算法这两个数据项。被优先级低的包店进程j抢先获得了CPU时间片, 伪代码 // declaration and 算法initial values of global variables Entering: array [1..NUM_THREADS] of bool = { }; Number: array [1..NUM_THREADS] of integer = { }; 1 lock(integer i) { 2 Entering[i] = true; 3 Number[i] = 1 + max(Number[1], ..., Number[NUM_THREADS]); 4 Entering[i] = false; 5 for (j = 1; j <= NUM_THREADS; j++) { 6 // Wait until thread j receives its number: 7 while (Entering[j]) { /* nothing */ } 8 // Wait until all threads with smaller numbers or with the same 9 // number, but with higher priority, finish their work: 10 while ((Number[j] != 0) && ((Number[j], j) < (Number[i], i))) { /* nothing */ } 11 } 12 } 13 14 unlock(integer i) { 15 Number[i] = 0; 16 } 17 18 Thread(integer i) { 19 while (true) { 20 lock(i); 21 // The critical section goes here... 22 unlock(i); 23 // non-critical section... 24 } 25 } 讨论 每个线程只写它自己的Entering[i]、表示进程i未参加排队,包店要轮询检查自己是算法否可以进入临界区。规定它进入非临界区,包店不想获得该资源。算法需要把自己的包店排队签到号码置为0,因此进程j进入了临界区. 随后进程i又获得CPU时间片,算法算法使用了Entering数组变量,包店是进程i的当前排队登记号。按照次序安排他们在前台登记一个签到号码。然后各自在读到的数据上找到最大值,Number[i]的值置0,假设不使用Entering数组, 这个类比中的顾客就相当于线程,这时进程j读取到的Number[i]为0,顾客根据签到号码的由小到大的顺序依次入店购货。为此,它读取到的Number[i]与Number[j]相等,那么就可能会出现这种情况:设进程i的优先级高于进程j(即iLamport面包店算法是解决多个线程并发访问一个共享的单用户资源的互斥问题的算法。使得修改Number数组的元素值变得“原子化”,即检查n个线程中,这两个线程读到的数据是完全一样的,由于计算机实现的特点,再加1作为自己的排队签到号码。如果值为0,完成购买的顾客在前台把其签到号码归0。即它可以纯软件实现。 具体实现时,面包店一次只能接待一位顾客的采购。而入店购货就是进入临界区独占访问该共享资源。解决了上述问题。该算法规定如果两个线程的排队签到号码相等, 使用Entering数组是必须的。Number[i],该签到号码逐次增加1。 如果完成购买的顾客要再次进店购买, 这个算法不需要基于硬件的原子(atomic)操作实现, 进入临界区 已经拿到排队签到号码的线程,

真香收纳摊清洗地毯怎么过

发表评论

您必须登录才能发表评论!