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

c++ - 我应该如何使用条件变量解决哲学家就餐问题?

我使用条件变量编写了模拟用餐哲学家的简单程序,问题是有些哲学家永远没有机会吃饭。

我试图在 _condVar.Wait lambda 函数中放置断点,以确保 putdownForks 方法通知其他等待线程,我确实这样做了,但我仍然不明白为什么其他线程永远不会吃东西。

这是输出状态随时间变化的方式

如您所见,id 为 1、2 和 4 的哲学家从不吃东西。

0 投票
1 回答
1821 浏览

c - C中的信号量死锁

我有一个关于餐饮哲学家计划死锁的作业。我被要求制作一个名为“sections1.c”的文件,该文件存在死锁问题,在完成创建死锁后,我将复制代码并解决文件“sections2.c”中的死锁条件。我的老师让我们用 MDAT 编程。MDAT 应该像信号量和 pthread 函数一样运行,正如他在 M​​DAT 指南中给我们的那样。

MDAT 应该负责调度程序并通过在运行时播种当前时间来随机调度踏板。

在我不允许编辑的主文件中,函数 sectionInitGlobals 运行一次,sectionRunPhilosopher 在每个 pthread_create 中运行一次。

一个问题可能是我以前从未使用过信号量,并且使用不正确。

在测试我的代码时,我可以使用我想要的任意数量的线程和轮次运行它,但是,似乎使用更多线程可以保证死锁。当我用 100 个线程运行代码时,它每次都会遇到死锁,但是如果线程越多,它发生死锁的机会就不应该减少吗?

结果:

对于 16 个线程和 10 轮,死锁有时取决于调度程序。

使用 6 个线程和 5 轮,死锁发生率为 0%。

在 100 个线程和 5 轮的情况下,死锁的发生率为 100%。

编辑:

当没有发生死锁并且程序认为发生死锁时,跟踪文件结束:

无死锁:

僵局:


回答后编辑

感谢mevets!最终代码:section1.c - 想要死锁

section2.c - 不想死锁

0 投票
1 回答
1241 浏览

c++ - 这个解决哲学家就餐问题 (dpp) 的解决方案是如何工作的?互斥量和信号量

我正在尝试解决哲学家就餐问题问题: https ://en.wikipedia.org/wiki/Dining_philosophers_problem ),我找到了以下代码的解决方案。解决方案使用信号量和一个互斥体。我自己实现了忙等待简单信号量,因为 C++ 不提供信号量。我不明白互斥锁锁定take_forksput_forks功能的目的是什么。

我试图找到我的问题的答案,但我找不到。所以我在stackoverflow中问。

我的问题是:

  1. 互斥锁锁定take_forksput_forks功能的目的是什么?(什么会导致竞争条件发生?)
  2. 这个解决方案的名称是什么?这是仲裁解决方案吗?

这是我的代码

我希望互斥锁必须test起作用,因为这是我发现的竞争条件的唯一原因。

任何答案和建议表示赞赏!谢谢!

0 投票
1 回答
630 浏览

c++ - 哲学家进餐问题 - 只有 2 个线程有效

我正在尝试解决哲学家进餐问题

就我而言,每个哲学家都应该吃 1,000,000 次。问题是它似乎只有“1”并且是“3”吃完了。我正在使用带有临界区锁的线程,这是我的代码:

  • 每个哲学家必须交替思考和吃饭。然而,哲学家只有在左右叉子都有的情况下才能吃意大利面。每个叉子只能由一个哲学家持有,因此只有在另一位哲学家不使用叉子时,哲学家才能使用叉子。
0 投票
0 回答
93 浏览

c - 使用命名信号量在进程之间进行同步

我正在尝试实现经典餐饮哲学家问题的修改形式。

假设有 5 位哲学家坐在桌子上。桌子上有 3 个叉子和 3 个勺子。哲学家可以拿起桌子上的任何勺子或叉子。哲学家吃饭需要叉子和勺子。

我用一个过程来代表每个哲学家。我使用了两个命名信号量:semf 和 semt 分别代表叉子和勺子。

该过程未同步。证明这一点的一个简单方法是让两个哲学家提供一个勺子和一个叉子。

这是代码:

我正在使用带有标志 -lpthread -lrt -pthread 的 gcc 编译程序。

0 投票
2 回答
151 浏览

c - 当两个或多个哲学家检查互斥锁为 1 并同时关闭互斥锁并进入测试函数时会发生什么

如您所见,在这段代码中,我们有一个互斥锁,它最初是一个互斥锁,这意味着没有哲学家在测试分叉是否是免费的。当两个或多个哲学家同时检查互斥锁并碰巧看到互斥锁是一个并且两者同时在互斥锁下并进入该函数以测试分叉是否空闲时会发生什么?这是否会发生是我的问题?

0 投票
1 回答
3356 浏览

c - 使用 pthread、互斥锁和条件变量解决哲学家就餐问题

我正在尝试使用 pthread、互斥锁和条件变量在 C 中实现哲学家就餐问题。

  • 它需要一个命令行参数来指定程序应该运行多长时间。我必须使用睡眠功能来完成此操作。
  • 每个哲学家最多可以吃 10 顿饭。一旦他们吃完 10 顿饭,pthread 就应该终止。
  • 在设定的时间结束时,pthreads 需要终止,并且应该打印每个哲学家吃的饭菜数量。

我的输出有一些问题:

  1. 使主函数休眠在命令行中输入的秒数似乎并没有使输出有所不同。
  2. 大多数哲学家都在为程序的大多数执行而挨饿。
  3. 当我打印出哲学家正在思考或吃饭时,即使应该只有哲学家 0-4,也会出现“哲学家 5”。

这是我的代码:

这是使用 10 秒的输出:

我会很感激任何帮助。谢谢!

0 投票
1 回答
1312 浏览

c - 用死锁活锁和饥饿来用餐哲学家

这是 geeksforgeeks 使用信号量解决哲学家就餐问题的解决方案:

https://www.geeksforgeeks.org/dining-philosopher-problem-using-semaphores/

这段代码发生死锁活锁和饥饿的可能性很低,我想改变它,它很有可能会发生死锁、活锁或饥饿,我该怎么做?

还有我如何确保这个解决方案不会 100% 出现任何这些问题(如果可能的话)

0 投票
1 回答
117 浏览

multithreading - 有没有办法在 DOS 中模拟多线程,例如在解决哲学家就餐问题时?

哲学家进餐问题是一个经典的计算机科学教科书问题,用于演示多线程的使用。正如维基百科所说

五位沉默的哲学家端着一碗意大利面坐在圆桌旁。叉子放在每对相邻的哲学家之间。

每个哲学家必须交替思考和吃饭。然而,哲学家只有在左右叉子都有的情况下才能吃意大利面。每个叉子只能由一个哲学家持有,因此只有在另一位哲学家不使用叉子时,哲学家才能使用叉子。在个别哲学家吃完饭后,他们需要放下两把叉子,以便其他人可以使用这些叉子。哲学家只能在他们可用时拿起他们右边的叉子或左边的叉子,并且在拿到两把叉子之前他们不能开始吃饭。

进食不受剩余意大利面或胃空间的限制;假设无限供给和无限需求。

问题是如何设计一门行为学科(并发算法),使哲学家不会挨饿;即,假设没有哲学家可以知道其他人何时可能想吃或想想,那么每个人都可以永远在吃和想之间交替。

该问题旨在说明避免死锁的挑战,死锁是一种无法取得进展的系统状态。

总之,这是多线程中的一个经典问题,表明需要使用互斥原则来避免资源匮乏。

我想在实模式 DOS 中实现这样的程序,但是 DOS 显然缺乏多线程能力。

我知道诸如RTKernel之类的第三方软件,但这对于这种情况来说似乎有点矫枉过正。

是否有任何模拟多线程的解决方案,以便我可以使用 16 位 x86 汇编语言在 DOS 中模拟哲学家就餐问题?

0 投票
0 回答
39 浏览

producer-consumer - 信号量和线程同步

我一直在尝试通过一些经典问题来学习信号量和线程同步,例如生产者-消费者问题和餐饮哲学家的问题。

在阅读用 C 实现的上述问题的解决方案时,我偶然发现了这两种解决方案中都存在的这段代码段

据我所知,

信号量的实现使得在给定时间只有一个进程可以访问程序的一部分

pthread_join做同样的事情,不是吗?它延迟一个线程的执行,直到另一个线程完成执行。

那么即使实现了信号量,为什么还要添加这个功能呢?