哲学家就餐问题

问题描述
哲学家就餐问题
方案一:
#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操作是不会阻塞的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是以前写的一篇文章,今天发布出来该问题涉及多线程的内容,可以看我的这篇文章 POSIX多线程初步GitHub 地...
    南山脚下一棵树阅读 9,866评论 0 1
  • 死锁的四个条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞...
    icecrea阅读 13,792评论 3 7
  • 前言 这是我第一眼看到该问题时想到的解决方式之一,不知道可不可行,如果大家有什么看法可以探讨探讨。 问题描述 有五...
    Maxi_Mao阅读 7,535评论 1 1
  • 之前一直很少用到条件变量,最近看了看,顺便尝试写了写哲学家就餐问题。 问题描述 如图,五个哲学家围着圆桌吃意面,每...
    NeverLee阅读 4,388评论 0 0
  • 场景:原版的故事里有五个哲学家(不过我们写的程序可以有N个哲学家),这些哲学家们只做两件事--思考和吃饭,他们思考...
    哈哈哈_哈哈哈阅读 4,371评论 0 3

友情链接更多精彩内容