美文网首页算法
PV原语和哲学家吃面问题

PV原语和哲学家吃面问题

作者: 长生宝宝天凡 | 来源:发表于2018-08-27 16:38 被阅读0次

    问题描述

    五个哲学家围坐在一张圆桌旁,桌子中央一盘通心面(面假设无限),每个人面前有一只空盘,每两个人之间放一把叉子。为了吃面,每个哲学家都必须获得两把叉子,且只能从自己左边或右边取

    存在问题

    假如五个哲学家同时拿起右手边的叉子,那么五个人都将等待相邻哲学家手中的叉子,出现“死锁”。PV原语讲解决死锁问题。

    java版本实现

    未解决死锁

    Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};
            for(int i=0;i<5;i++){
                final int index=i;
                new Thread(()->{
                    while(true){
                        try {
                            forks[index].acquire(); //P(index)
                            forks[(index+1)%5].acquire();//P((index+1)%mod5)
                            System.out.println("第"+index+"个哲学家在通心粉");
                            forks[index].release();
                            forks[(index+1)%5].release();
                            System.out.println("第"+index+"个哲学家吃完了");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
    

    解决死锁

    Semaphore[] forks= new Semaphore[]{new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1),new Semaphore(1)};
            Semaphore limit = new Semaphore(4);
            for(int i=0;i<5;i++){
                final int index=i;
                new Thread(()->{
                    while(true){
                        try {
                            limit.acquire();
                            forks[index].acquire(); //P(index)
                            forks[(index+1)%5].acquire();//P((index+1)%mod5)
                            System.out.println("第"+index+"个哲学家在通心粉");
                            forks[index].release();
                            forks[(index+1)%5].release();
                            limit.release();
                            System.out.println("第"+index+"个哲学家吃完了");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
    

    PV原语

    PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量

    相关文章

      网友评论

        本文标题:PV原语和哲学家吃面问题

        本文链接:https://www.haomeiwen.com/subject/vbqtwftx.html