美文网首页操作系统
哲学家就餐问题

哲学家就餐问题

作者: 大海孤了岛 | 来源:发表于2017-04-06 18:08 被阅读325次
问题描述
哲学家就餐问题
方案一:
#define N 5 //哲学家个数
semaphore fork[5]; //信号量初始值为1

void philosopher(int i){ //哲学家编号:0-4
    while(true){
        think();            //哲学家在思考
        P(fork[i]);         //去拿左边的叉子
        P(fork[(i+1)%N]);   //去拿右边的叉子
        eat();              //吃面条中
        V(fork[i]);         //放下左边的叉子
        V(fork[(i+1)%N]);   //放下右边的叉子
    }
}

该方案能满足大多数情况,但仍存在这么个情况,5个哲学家同时拿起左边的刀叉,那么会导致没有人可以吃面条,导致死锁。

方案二:使用一个信号量,保证只有一个人就餐
#define N 5 //哲学家个数
semaphore fork[5]; //信号量初始值为1
semaphore mutex;    //互斥信号量,初始值为1
void philosopher(int i){ //哲学家编号:0-4
    while(true){
        think();            //哲学家在思考
        P(mutex);           //进入临界区

        P(fork[i]);         //去拿左边的叉子
        P(fork[(i+1)%N]);   //去拿右边的叉子
        eat();              //吃面条中
        V(fork[i]);         //放下左边的叉子
        V(fork[(i+1)%N]);   //放下右边的叉子

        V(mutex);           //退出临界区
    }
}

该方案是正确的,不存在死锁,但效率很低。

方案三:设置哲学家拿刀叉的时候存在差异,分奇偶来确定拿刀叉的方式
#define N 5 //哲学家个数
semaphore fork[5]; //信号量初始值为1
void philosopher(int i){ //哲学家编号:0-4
    while(true){
        think();            //哲学家在思考
        if (i % 2 == 0){
            P(fork[i]);         //去拿左边的叉子
            P(fork[(i+1)%N]);   //去拿右边的叉子
        } else {
            P(fork[(i+1)%N]);   //去拿右边的叉子
            P(fork[i]);         //去拿左边的叉子
        }

        eat();              //吃面条中
        V(fork[i]);         //放下左边的叉子
        V(fork[(i+1)%N]);   //放下右边的叉子
    }
}

注意:这里只需要对P操作进行分类,对V操作不需要进行分类,因为V操作是不会阻塞的。

相关文章

  • 五个哲学家就餐----死锁问题

    五个哲学家就餐----死锁问题

  • 哲学家就餐问题

    这是以前写的一篇文章,今天发布出来该问题涉及多线程的内容,可以看我的这篇文章 POSIX多线程初步GitHub 地...

  • 哲学家就餐问题

    问题描述 方案一: 该方案能满足大多数情况,但仍存在这么个情况,5个哲学家同时拿起左边的刀叉,那么会导致没有人可以...

  • 哲学家就餐问题

    场景:原版的故事里有五个哲学家(不过我们写的程序可以有N个哲学家),这些哲学家们只做两件事--思考和吃饭,他们思考...

  • 哲学家就餐问题 条件变量

    之前一直很少用到条件变量,最近看了看,顺便尝试写了写哲学家就餐问题。 问题描述 如图,五个哲学家围着圆桌吃意面,每...

  • 经典同步问题:哲学家就餐

  • 线程同步经典问题之哲学家就餐问题

    问题描述由Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题描述的是五个哲学家共用一张圆桌,分别坐...

  • 哲学家就餐问题与死锁总结

    死锁的四个条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞...

  • 哲学家就餐算法

  • 死锁

    哲学家就餐问题五个哲学家围圆,哲学家需要思考休息吃饭,但只有5支筷子吃饭使用两支筷子,每次只取一支筷子,且只能取身...

网友评论

    本文标题:哲学家就餐问题

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