Peterson解答

tech2025-06-03  10

前言

有关Peterson解答的记录; 若有不当之处,请您指出,你的指点是我的荣幸!

Peterson解答

Peterson解答是一个经典的基于软件的临界区问题的解决方案

Peterson算法适用于两个进程交错执行临界区与剩余区

在本文中,这两个进程分别是P0和P1

Peterson解答要求两个进程共享两个数据项

int turn; boolean flag[2];

变量turn表示哪个进程可以进入临界区;即如果turn==i,那么进程Pi允许在临界区内执行。数组flag表示哪个进程准备进入临界区。

例如:如果flag[i]为true,那么进程Pi准备进入临界区。

为了进入临界区,进程Pi首先设置flag[i]的值为true;并且设置turn的值为j,从而表示如果另一个进程Pj希望进入临界区,那么Pj就能进入。

如果同时有两个进程同时试图进入,那么turn的值会同时被设置成i和j然而只有一个赋值语句的结果会被保持;另一个也会被设置,但会被立即重写。Peterson的关键就在于turn的最终值!它决定哪个进程进放入临界区!

代码实现:

/** * 测试Peterson算法 */ public class Test01 implements Runnable { private static int ticket = 20; private static boolean[] flag = {false, false}; private static int turn; public static void main(String[] args) { new Thread(new Test01(), "0").start(); new Thread(new Test01(), "1").start(); } @Override public void run() { int num = Integer.valueOf(Thread.currentThread().getName()); int other=num==0?1:0; do { flag[num] = true; turn = other; while (flag[other] && turn == other) { //do nothing } //临界区 if (ticket <= 0) { System.out.println("票已售空"); return; } System.out.println("Thread-->" + num + "-->is waiting......" + ticket-- + "-->turn-->" + turn); flag[num] = false; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } while (true); } }
最新回复(0)