Peterson解答

前言

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

Peterson解答

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

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

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

Peterson解答_第1张图片

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

int turn;
boolean flag[2];

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

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

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

如果同时有两个进程同时试图进入,那么turn的值会同时被设置成ij然而只有一个赋值语句的结果会被保持;另一个也会被设置,但会被立即重写。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);
    }
}

你可能感兴趣的:(OS)