问题标签 [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 回答
535 浏览

c++ - pthread_cond_wait 奇怪的行为

我正在尝试使用 C++解决餐饮哲学家的问题。

代码用g++ -lpthread.

整个解决方案在哲学家 github 上。Repository 包含两个 cpp 文件:main.cpp 和philosopher.cpp。“Main.cpp”创建互斥变量、信号量、5 个条件变量、5 个分叉,并启动哲学家。信号量仅用于同步哲学家的启动。其他参数被传递给哲学家来解决问题。“Philosopher.cpp”包含给定问题的解决方案,但经过几步就会发生死锁。

当哲学家 0 正在吃饭,而哲学家 1(在他旁边)想拿叉子时,就会发生死锁。然后,哲学家 1 拿走了互斥锁,直到哲学家 0 放下他的叉子才把它还给它。由于采取了互斥锁,哲学家 0 不能放下他的叉子,所以我们陷入了僵局。问题出在Philosopher::take_fork 方法中,调用 pthread_cond_wait(a,b) 没有释放 mutex b。想不通为什么?

其余的请参考此代码

0 投票
1 回答
1346 浏览

algorithm - 哲学家晚餐的指挥解决方案

所描述的哲学家晚餐问题的指挥解决方案建议使用大小为 4 的信号量,并且所有哲学家都尝试在右叉之前先获得左叉。 http://en.wikipedia.org/wiki/Dining_philosophers_problem#Conductor_solution

信号量是否应该用于访问左叉的每个人和访问右叉的每个人?

如果一个哲学家可以在规定的时间内得到左叉但没有得到右叉,他应该怎么做?他们应该把左叉还给吗?

哲学家按什么顺序返回叉子有关系吗?

当然,这种解决方案仍然会导致饥饿。例如,wiki 说 A 和 C 都有两个分叉。这意味着信号量将不再对任何人说分叉并挂在第五个。D 和 E 之间的叉子必须留在桌子上。然后说A返回他的右叉。

现在信号量将回到 3。

D 可以再试一次左叉,然后意识到他不能正确。B只能离开。又没用。

A 可以尝试再次选择右叉,因为他已经有了左叉。这意味着我们绕着圈子转。

我错过了一些东西

帮助?

0 投票
2 回答
185 浏览

multithreading - 为什么左/右序列在哲学家晚餐的指挥解决方案中很重要?

所描述的哲学家晚餐问题的指挥解决方案建议使用大小为 4 的信号量,并且所有哲学家都尝试在右叉之前先获得左叉。http://en.wikipedia.org/wiki/Dining_philosophers_problem#Conductor_solution

它还表明哲学家按左/右顺序拿起叉子?

为什么哲学家按左/右顺序拿起叉子很重要?

还是都在同一个序列中(我猜它们也可以是右/左)?

0 投票
0 回答
72 浏览

algorithm - 哲学家晚餐的叉子是固定的吗?

哲学家晚餐是一个经典的并发问题。请参阅此处的说明。在导体解决方案中,叉子放回特定位置或只是放入一般堆中。那么任何哲学家的左叉都会是同一个左叉吗?或者随着晚上的进行,它可以是一个不同的叉子吗?

0 投票
3 回答
2180 浏览

java - Dining Philosopher - 最后一个线程没有正确终止

我写了这个餐饮哲学家的代码,但最后一个线程没有产生所需的“xxx已经完成他的晚餐”行?我做错什么了?

似乎最后一个线程过早终止。

我将不胜感激这方面的任何帮助。

0 投票
2 回答
903 浏览

java - Java哲学餐厅

我一直在从事哲学家就餐任务,但我遇到了一个问题,我的代码围绕 3 个类,叉子、哲学家和 dinerTable(是的,我错误地用小写字母命名了最后两个)。

代码正常启动,哲学家 0 和 2 抓住他们的叉子,但随后代码停止了,谁能帮帮我吗?

有3类:

叉子(扩展线程):

哲学家(实现可运行):

餐桌:

0 投票
1 回答
5539 浏览

java - Java 餐厅哲学家监视器

我的 Java 代码中有一个问题应该模拟餐饮哲学家问题,如下所述:http ://en.wikipedia.org/wiki/Dining_philosophers_problem 我想在其中一个人吃饭或吃饭时输出所有哲学家的当前状态认为。输出应该是这样的:“OXO o X (2)”,其中“X”表示哲学家在吃东西,“O”表示他在思考,“o”表示他在等筷子。括号中的数字表示状态发生变化的哲学家的数量。我遇到的问题是只有哲学家 1 和 3(有时是 2 和 4)吃东西,而其他人总是思考或等待分叉,并且不断重复,所以输出如下所示:

奥克斯 (2)

o X o XO (4)

o O o X o (2)

o O o O o (4)

o X o O o (2)

o X o X o (4)

o O o X o (2)

...

完整代码在这里:

我知道已经有几个关于在 Java 中用餐哲学家的问题,但似乎没有一个有帮助,而且我的代码有点不同。谢谢。

0 投票
3 回答
2678 浏览

c++ - 餐饮哲学家和互斥体初始化

我正在尝试解决哲学家进餐问题。所以我几乎编写了整个代码,但问题是我无法初始化监视器(我已经制作了我用 C++ 重写的伪代码)所以我真的无法测试程序. 谁能帮我说说 monitor/mutex_init 的初始化有什么问题?

我在第 18 行收到错误,它类似于:错误:'int pthread_mutex_init' redeclared as different kind of symbol

将其更改为 int pthread_mutex_init(&monitor,NULL); 不行!

通过添加 int pthread_mutex_init(pthread_mutex_t *monitor, NULL);

我收到错误:“__null”之前的预期标识符</p>

0 投票
1 回答
581 浏览

c# - How to determine when threads are in a deadlock from Main C#

I have read other posts about tools for deadlock detection and avoiding deadlock; but my question is specifically about how to find when threads are in deadlock from Main so that I can make the Main thread sleep until the threads are deadlocked and proceed further.

I tried to use ThreadState.WaitSleepJoin to detect whether all threads are deadlocked for a longer period of time in Main, but that doesn't seem like working; Are there any utility methods available to determine when all threads are deadlocked?

I am trying to implement deadlock scenario in Dining philosophers where when all the threads take either right or left chopstick first, they will wait for the other chopstick forever and hence deadlock occurs; only issue is that I am not able to find when all these threads enter into waiting state for ever from Main.

This is my Run method:

This is Main:

How can I replace the WaitSleepJoin with an efficient solution to find out when all threads are deadlocked?

Please help, any suggestions are greatly appreciated! thank you!

0 投票
1 回答
8578 浏览

c - 使用 fork() 在 C 中用餐哲学家

前段时间,我使用 pthread 为哲学家就餐问题编写了一个 C 程序,现在正尝试将其更改为使用 fork()。这是我已经通过的讲座的练习。但是一个朋友向我寻求帮助,我似乎无法自己弄清楚,这让我发疯了!

如果我做一个“ps”,那么进程就在那里。但是标准输出没有任何输出,所以我认为我在管道上做错了。

预先感谢您的任何帮助。