问题标签 [dining-philosopher]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3545 浏览

c - 使用 mmap 使整数数组对子进程可见

我正在研究餐饮哲学家的问题,并且不能使用线程,所以我需要使用共享内存来使筷子和哲学家的数组对所有子进程可见。我正在尝试使用 mmap,但是,我对 mmap 的使用不正确,我不确定如何修复它,因为我的论点是 int 数组,而不是根据这个问题的 int 。我应该使用不同的功能在共享内存中创建它吗?

0 投票
1 回答
1314 浏览

operating-system - 左撇子和右撇子哲学家的混合物,一个棘手的问题?

引理 1:我们知道在左撇子和右撇子哲学家混合在一起的任何桌子上,都不会发生死锁。我很熟悉它的样张。

我最近在面试中遇到了以下问题。

有 5 位哲学家坐在一张圆桌旁。每两个哲学家之间都有一根筷子。每个哲学家都需要两根筷子吃饭。我们有两种哲学家:左撇子和右撇子。左撇子先用左手拿筷子。右手先拿筷子用右手。假设在 5 个哲学家中至少有 1 个左撇子和至少 1 个右撇子。哪一个是真的:

a) 在圆桌会议上独立于放置哲学家的组合,没有僵局。(我确定是真的)

b) 如果所有哲学家同时拿起第一根筷子,就会出现僵局。(我认为这是真的,因为暗示如果我们有 a-->b 并且 a 是假的 a-->b 是真的。在这个选项中,没有办法让所有哲学家同时拿起第一根筷子,所以整个陈述是真实的。)

任何专家都可以帮助我,我的论点是真的吗?

编辑1:我添加了引理1的证明:(但上面提到的问题有一些不同。)

首先观察到,由于围绕桌子获取资源的模式,只有一个可能的等待周期,即涉及所有哲学家的周期。所以假设这样的僵局。每个哲学家都必须在等待,我们的意思是等待另一个人拿着的筷子。因此,所有的筷子都必须握住。如果我们的表混合了左撇子和右撇子哲学家,则必须至少有一对相邻的相反习惯的哲学家。首先假设左撇子哲学家(“Lenny”)坐在右撇子哲学家(“Roger”)的左边。因为所有的筷子都必须握住,所以 Lenny 或 Roger 必须握住他们之间的筷子。如果莱尼拿着它,那就是他的“右筷子”,所以他之前肯定已经拿到了他左边的筷子。于是莱尼拿着两根筷子,并且没有等待获得任何东西(他正在吃东西),所以没有僵局。如果罗杰拿着夹在他们中间的筷子,那就是他的“左筷子”​​,那么他肯定之前已经拿到了他右边的筷子,等等。如果我们把前面的情况称为“外伸”的情况,那么“内伸” ” 案例是一个右手哲学家坐在左撇子哲学家的左边。同样,如果我们陷入僵局,则必须握住所有筷子,因此其中一个人将筷子夹在它们之间。这意味着另一个人没有筷子,因为他们之间的那个是每个人都会尝试获取的第一个筷子(罗杰向右伸手拿到筷子,或者莱尼向左伸手拿到筷子;另一个人在伸手之前等待它向外的方向)。如果有n个哲学家和n根筷子,所有筷子都拿着,但是一个哲学家拿着零个筷子,那么 n-1 个哲学家拿着 n 个筷子。有些哲学家必须拿着两根筷子;那个哲学家没有在等待(他在吃饭),所以没有僵局。

0 投票
1 回答
389 浏览

c - 将信号量放入共享内存 C

我试图在分叉后使信号量对多个进程可见。这是用餐哲学家的问题,使用共享内存和信号量来确保一次只有一个哲学家拿起筷子(不是最有效的方法,一组信号量会更有效,但这不是重点)。它正在进入 start 内部的 while 循环,打印出它进入的内容,但没有任何进程通过任何进程进入 if 语句。全球范围: int semId;

Inside my main:

完整代码可在此处获得:http ://pastie.org/10054082在全局声明了一些不应该声明的内容,但一旦我开始工作,它们就会被清理干净

0 投票
1 回答
179 浏览

netlogo - 类似于 Dining Philosophers 的拍卖实现

我正在尝试在 netlogo 中实现一个拍卖概念——它类似于哲学家就餐问题程序。

我的程序处理与哲学家就餐程序中的哲学家和叉子相对应的计算机和处理器。在哲学家程序中,用户需要 2 个叉子才能吃饭,但在计算机和处理器中,一台计算机需要一个处理器才能工作。

我的程序中定义的状态是IDLE, NEED, ,USING对应于哲学家程序中的 , 。THINKINGHUNGRYEATING

目前,我的程序到了所有计算机状态都更改为NEED. 我在为计算机获取服务器时遇到问题。

代码片段是 -

0 投票
0 回答
1066 浏览

process - 使用资源层次解决方案就餐哲学家

因此,据我所知,这个解决方案的问题在于它太耗时了。在我正在阅读的解释中以及在维基百科上,假设哲学家#1同时具有叉子#3和#5。但现在他还需要#2 分叉,所以他放下#3 和#5,然后分别拿起#2、#3 和#5。现在,在我们例子的框架中,如果一个哲学家只需要两把吃饭,为什么他实际上会同时需要三把叉子呢?还是我在此过程中误解了什么?

0 投票
1 回答
131 浏览

java - 我的五位哲人都在同一时间吃饭,为什么?

这是阶级哲学家

它应该在终端打印出什么在做什么,问题是他们应该一个一个地吃,或者在最好的情况下最多两个哲学家。然而,他们一起吃。同步没有做它应该做的事情。问题出在哪里?

0 投票
1 回答
1615 浏览

algorithm - Chandy/Misra 就餐哲学家解决方案

因此,根据这篇维基百科文章中的 Chandy/Misra 部分,我们有 5 位哲学家,编号为 P1-P5。

基于此报价:

对于每对争夺资源的哲学家,创建一个分叉并将其提供给 ID 较低的哲学家(n 代表代理 Pn)。每个叉子可能是脏的或干净的。最初,所有前叉都是脏的

当一个有叉子的哲学家收到请求消息时,如果叉子是干净的,他会保留叉子,但如果叉子脏了,他就会放弃。如果他把叉子送过来,他会在这样做之前清理叉子。

因此,知道所有分叉最初都是脏的,请考虑以下引用及其下方的图像。

对于每一对 Swansons,将叉子交给 id 较小的人。

我的问题是,如果 P3 现在向他的邻居 P2 请求第二个叉子,P2 是否会因为它很脏而放弃他的单个叉子,即使他刚刚捡起它?

0 投票
2 回答
136 浏览

c++ - C++ 中线程所做的更改

我正在尝试模拟餐饮哲学家的问题,但我无法将其可视化。当线程从 Waiting() 移动到 Eating() 再到 Thinking() 时,它会更改一个名为 state 的变量来表示这一点。但是在我的主线程中,它永远不会看到状态变量的变化。它在绘图时调用状态返回函数来改变哲学家的颜色。

有什么帮助吗?

这是一些代码:状态更改

返回函数

返回函数的调用

0 投票
2 回答
137 浏览

java - 就餐哲学家——我对所有人说话,只有一个人在听

我正在实施哲学家就餐问题,我自己也遇到了一个问题,我不知道是什么原因,所以我在这里。

晚饭后我告诉他们离开,我想强迫他们创建报告,因为那是他们生命的下一个阶段。当我这样做时,所有人都会回应,但只有一个行动:

控制台输出:



这是哲学家类:



餐厅等级:

0 投票
2 回答
838 浏览

java - 在 Java 中用餐哲学家

今天,我决定尝试解决哲学家进餐问题。所以我写了下面的代码。但我认为这是不正确的,所以如果有人告诉我它有什么问题,我会很高兴。我使用分叉锁(我只阅读它们,因为我不会在同步块中访问它们),我有扩展线程的类并保留它的两个锁。

我认为有些不对劲,因为第五位哲学家从不吃东西,而第四位和第三位哲学家大多是在吃东西。提前致谢。