关键词:
【中文标题】餐饮哲学家问题中的饥饿【英文标题】:Starvation in the dining philosopher problem 【发布时间】:2019-02-07 22:47:58 【问题描述】:我一直在 wikipedia 上寻找哲学家就餐问题的解决方案。 The resource hierarchy solution
我了解它的工作原理以及打破循环结构如何防止死锁,但解决方案如何防止饥饿?一个或几个线程不能继续运行,而一些线程无法取得进展吗?
如果没有,是什么阻止了这种情况的发生?
实现:
public class DinningphilMain
public static void main(String[] args) throws InterruptedException
int numPhil = 3;
Philosopher[] phil = new Philosopher[numPhil];
Fork[] forkArr=new Fork[numPhil];
for (int i = 0; i < numPhil; i ++)
forkArr[i]= new Fork(i);
for (int i = 0; i < numPhil-1; i++)
phil[i]=new Philosopher(i, forkArr[i], forkArr[i+1]);
phil[numPhil-1]= new Philosopher(numPhil-1, forkArr[0], forkArr[numPhil-1]);
for (Philosopher p : phil)
new Thread(p).start();
这是哲学家课
import java.util.Random;
public class Philosopher implements Runnable
int sleep = 1000;
int id;
int eatTime= 500;
Random rand = new Random();
Fork left;
Fork right;
public Philosopher(int id, Fork left, Fork right)
this.id = id;
this.left = left;
this.right = right;
private void think()
System.out.println("Philosopher " + id + " is thinking");
try
int thinkingTime = rand.nextInt(sleep);
Thread.sleep(thinkingTime);
catch (InterruptedException e)
e.printStackTrace();
private void getForks()
System.out.println("Philosopher " + id + " is picking up forks");
try
left.get();
right.get();
System.out.println("Philosopher " + id + " has both forks");
catch (InterruptedException e)
e.printStackTrace();
private void releaseForks()
System.out.println("Philosopher " + id + " is putting down forks");
left.release();
right.release();
private void eat()
System.out.println("Philosopher " + id + " is eating");
try
Thread.sleep(eatTime);
catch (InterruptedException e)
e.printStackTrace();
@Override
public void run()
while (true)
getForks();
eat();
releaseForks();
think();
这是分叉类
public class Fork
private int id;
private Thread thread;
public Fork(int id)
this.id = id;
thread = null;
public int getId()
return id;
public synchronized void get() throws InterruptedException
if (thread != null)
this.wait();
thread = Thread.currentThread();
public synchronized void release()
if (thread == Thread.currentThread())
thread = null;
this.notify();
【问题讨论】:
【参考方案1】:资源层次解决方案解决了死锁,但不能解决饥饿问题。
为了防止饥饿,您需要:
来自线程系统的保证,线程将被解除阻塞 监视器和条件变量的顺序相同 被屏蔽了。
自己做。换句话说,你必须保证没有 哲学家可能会饿死。例如,假设您维护一个队列 哲学家。当哲学家饿了时,他/她会被放到 队列的尾部。哲学家只有在他/她处于领先地位时才能吃东西 排长队,筷子是否空闲。
这取自C560 Lecture notes -- Dining Philosophers
【讨论】:
我的困惑来自于当我在 Java 中实现解决方案时,哲学家似乎按顺序进食(1 然后 2 然后 3...),而且似乎没有饥饿。我正在使用 wait() 和 notify() 来访问分叉,但我很确定 Java 中的这些方法不能保证顺序,所以看起来很奇怪 你能分享你的实现吗? 我已经用实现编辑了帖子。我认为可能是 Thread.sleep() 调用确保没有线程占用所有分叉【参考方案2】:简短的回答是它没有。哲学家进餐问题用于讨论并发问题;它本身并不是任何事情的单一解决方案(因此它被称为问题)。
餐饮哲学家的***页面本身显示了一些实现。第一个展示了一个糟糕的解决方案实施将如何导致饥饿。
https://en.wikipedia.org/wiki/Dining_philosophers_problem
【讨论】:
餐饮哲学家 Java
】餐饮哲学家Java【英文标题】:DiningphilosophersJava【发布时间】:2016-03-0412:50:09【问题描述】:我今天有一个学校作业来模拟哲学家就餐问题。我刚刚编写了这段代码来测试它是否以这种简单的方式工作(A)。我现在遇到的问题是... 查看详情
餐饮哲学家的解决方案陷入僵局
】餐饮哲学家的解决方案陷入僵局【英文标题】:DiningPhilosopher\'ssolutionendingupindeadlock【发布时间】:2017-04-1011:52:00【问题描述】:我已经为餐饮哲学家的问题实施了资源层次结构解决方案。当我尝试比较两个筷子的n值时,它们... 查看详情
erlang和餐饮哲学家的并发[重复]
】erlang和餐饮哲学家的并发[重复]【英文标题】:Concurrencyinerlanganddiningphilosphers[duplicate]【发布时间】:2016-06-1708:41:13【问题描述】:我正在处理哲学家就餐算法。我需要使用此代码生成5位哲学家main()->philos1=spawn(?MODULE,philosophe... 查看详情
Go 中的哲学家就餐问题未通过单元测试
】Go中的哲学家就餐问题未通过单元测试【英文标题】:DiningphilosophersprobleminGofailsunittest【发布时间】:2022-01-1719:09:58【问题描述】:我正在学习围棋课程,其作业如下:用下面的方法实现餐饮哲学家的问题约束/修改。应该有5... 查看详情
(考研)哲学家进餐问题(附代码)
问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿... 查看详情
哲学家进餐
问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿... 查看详情
notifyAll() 不唤醒进程
...个小的Java程序,我需要在其中创建线程(我的代码中的哲学家),而这些哲学家需要在思考、饥饿和进食之间转换状态。我对这个项目还没有那么远,我遇到了下一个问题:publicclassNewMainstaticPhilosopher[]p;publicst 查看详情
ipc问题-哲学家就餐
如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃。哲学家在桌上只有思考(等待)和吃面(执行)。看起来最多是只有2个人能同时吃。 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样... 查看详情
(王道408考研操作系统)第二章进程管理-第三节11:哲学家进餐问题
...-第三节9:读者写者问题一:问题描述一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子中间是一碗米饭哲学家只干两件事情:思考和进餐哲学家在思考时,不影响别人哲学饥饿时,才试图拿起左、右两根筷... 查看详情
哲学家进餐问题
哲学家就餐问题之解1.引言问题描述:5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学家平时进行思考,只有当他们饥饿时,才拿起筷子吃饭。规定每个哲学家只能先取其左边筷子,然后取其右边筷子,然后... 查看详情
C中的信号量死锁
...时间】:2019-10-0200:41:38【问题描述】:我有一个关于餐饮哲学家计划死锁的作业。我被要求制作一个名为“sections1.c”的文件,该文件存在死锁问题,在完成创建死锁后,我将复制代码并解决文件“sections2.c”中的死锁条件。我... 查看详情
线程学习五:哲学家就餐问题
问题描述:设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿时才试图分两次从两边拿起筷子就餐。条件:1)拿到两只筷子时哲学家才开... 查看详情
操作系统第6次实验报告:使用信号量解决进程互斥访问(代码片段)
郑楚杭201821121009计算18111.选择哪一个问题选题为哲学家就餐问题2.给出伪代码算法思想:philosopher代表一个哲学家的活动,将其创建为五个不同的线程代表五位不同的哲学家。每位哲学家先思考(伪代码中的think),当某位哲学家... 查看详情
经典进程的同步问题之——哲学家进餐(代码片段)
哲学家进餐问题描述由Dijkstra提出并解决哲学家进餐问题(TheDinningPhilosophersProblem)是经典的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五个碗和五只筷子,他们的生活方式是... 查看详情
操作系统“哲学家进餐”问题
“哲学家进餐”问题有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最... 查看详情
掌握饥饿营销的三个层次,你就是高手
...们今天谈论的就是传说中的饥饿营销首先,我想问你一个问题:饥饿营销的方法是什么?我猜你答对了,答案就是:饥饿。限量供应,让用户饥饿。好,我再问你第二个问题:饥饿营销=限量供应吗?说对吧,因为不管是大公司... 查看详情
进程调度模拟——哲学家进餐问题(代码片段)
...面,5个盘子,5把筷子,5个座位上可以座5个哲学家,当哲学家就坐以后,其左右有且仅有一个筷子,每个筷子左又有且仅有一个哲学家。哲学家动作:思考,取筷(需要两个),取面... 查看详情
测试和设置指令中的饥饿
...Starvationintestandsetinstruction【发布时间】:2016-03-1820:21:53【问题描述】:GATE考试中提出了以下问题:enter_CS()和leave_CS()函数用于实现一个进程的临界区,使用test-and-set指令实现如下:voidenter_CS(X)whiletest-and-set(X);voidleave_CS(X)X=0;在上... 查看详情