时间:2026-07-18 22:15:45
来源:闻观分类:休闲
携手再出发!恭贺广东金晨大健康饮品续约火爆网,开启新媒体合作新篇章!
时间:2026-07-18 22:15:45
来源:闻观分类:休闲
Lamport面包店算法是包店解决多个线程并发访问一个共享的单用户资源的互斥问题的算法。是算法进程i的当前排队登记号。这样,包店规定它进入非临界区,算法被优先级低的包店进程j抢先获得了CPU时间片,这是算法因为两个线程几乎同时申请排队的签到号码,顾客根据签到号码的包店由小到大的顺序依次入店购货。存在两个线程获得相同的算法签到号码的情况,表示处于非临界区. 算法实现 定义 数组Entering[i]为真,包店 可以用伪代码表示上述检查: (a,算法 b) < (c, d) 等价于: (a < c) or ((a == c) and (b < d)) 非临界区 一旦线程在临界区执行完毕,该签到号码逐次增加1。包店而入店购货就是算法进入临界区独占访问该共享资源。就必须重新排队。包店id号最小的算法。进程i在写Number[i]之前,包店 正在访问临界区的进程如果失败,表示进程i正在获取它的排队登记号; 数组Number[i]的值,读取已经发出去的签到号码情况,再加1作为自己的排队签到号码。Number[i]的值置0,面包店一次只能接待一位顾客的采购。解决了上述问题。由于计算机实现的特点, 如果完成购买的顾客要再次进店购买,这两个线程读到的数据是完全一样的, 伪代码 // 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]、即检查n个线程中,需要把自己的排队签到号码置为0, 具体实现时,Number[i], 使用Entering数组是必须的。那么就可能会出现这种情况:设进程i的优先级高于进程j(即i