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

deadlock - 如何避免饥饿?

我正在尝试修复我的代码,我已经解决了死锁和互斥问题,但我不知道如何避免饥饿,因为在 promela (PML) 中没有监视器。有人能帮我吗?提前致谢

0 投票
1 回答
55 浏览

java - 在多个线程上加入()并处理泄漏的输出

我正在用 Java 解决一个多线程问题,并解决了核心问题本身,但我的输出不是我所期望的。

我有一个主线程,它旋转新线程,每个线程都执行它们的任务。它看起来像以下(伪代码):

我的问题发生在尝试join()在我的线程列表中的每个线程上。我的程序时不时陷入无限循环,因为我猜interrupt()我在线程列表上的调用与 相比发生得不够快,join()而且并非所有线程都被中断。

当程序确实正确关闭线程并打印终止输出时,会出现我的另一个问题。当程序运行时,每个线程都有它记录到控制台的消息,并且在我中断线程并显示最终的程序消息之后,这些线程特定的日志消息中的一些会泄漏到控制台。

例如,假设我的一个线程"Thread-1 waiting for lock on object..."在运行时输出,主程序最终将自己唤醒,终止线程并输出"Program finished"。有时,线程特定的消息会程序终止消息之后出现。

如果有人可以帮助我弄清楚如何阻止这种情况发生,请告诉我!

关机线程()

}

编辑:我想做的一件事是重写shutdownThreads()来做到这一点:

但这似乎不太优雅。

0 投票
1 回答
200 浏览

java - 餐饮哲学家 Java

我今天有一个学校作业来模拟哲学家进餐问题。

我刚刚编写了这段代码来测试它是否以这种简单的方式工作(A)。我现在遇到的问题是,当一个不应该吃东西的人开始吃东西时。这意味着当筷子被拿走时,他无论如何都会开始吃东西......请给我提示:)这是代码:

0 投票
1 回答
1551 浏览

java - 如何在 Java 中的另一个线程内创建一个完全独立的线程?

作为我研究的一部分,我尝试在 Java RMI 中实现一个客户端-服务器软件来解决哲学家就餐问题(https://en.wikipedia.org/wiki/Dining_philosophers_problem )。

网络必须能够识别意外断开连接(fe 崩溃)的客户端并恢复其状态。目前,我的服务器应用程序跟踪网络中的所有客户端(注册新客户端、重置其他客户端以分发椅子),但不跟踪它们的状态。

因此,我想使用一个主动系统,一旦其中一个客户端无法连接到另一个客户端,它将使用服务器上的 RMI 函数来删除客户端(首先从服务器上的 ArrayList 中删除它,然后删除它完全通过重置所有客户端):


来自 Server.java 的片段


来自 Client.java 的片段


这意味着我首先检查是否可以从 ArrayList 中删除客户端(或者其他人是否已经将其删除),然后通过重置网络中的所有客户端来执行客户端的最终删除。

但现在我有一个问题。Client.java 的代码片段被几个函数使用,这些函数由 Philosopher.java 类中的 Threads 调用(fe 在获取远程客户端上的叉子或椅子期间)。要重置所有客户端,我首先停止 Client.java 中的所有线程并加入它们:


来自 Philosopher.java 的片段以停止线程(在 run() 中使用 while(running) 循环


来自 Client.java 的片段以停止/加入线程


但似乎我无法加入内部线程类中调用 resetClientsForRemoval 的线程。


我的问题:

是否有不同的方法来调用删除函数以将它们与调用线程完全分开?否则它将是一个循环锁,因为我尝试通过在该线程正在执行的函数中调用 join 函数来加入线程。

提前感谢您的所有帮助!

干杯,

斯特凡


如果需要,从 Client.java 重置函数

0 投票
0 回答
828 浏览

c - 使用 MPI C 编写餐饮哲学家程序

我的 MPI C 程序有问题。这是代码:

问题是所有进程同时进食而不等待邻居。我认为邻居不会收到 MPI 发送的新状态。你有解决这个问题的想法吗?

0 投票
1 回答
137 浏览

erlang - erlang 和餐饮哲学家的并发性

我正在处理哲学家就餐算法。我需要使用此代码生成 5 位哲学家

有人可以给我一个关于哲学家和叉子函数的粗略概念吗?

0 投票
0 回答
78 浏览

c - 监控 C 中给定结构的时间

我正在研究与C中的餐饮哲学家问题相当的问题。

我们的主题有一些新规则,添加了 Resting 状态和以下规则:

各州的‘思考’和‘吃’有一个你必须确定的最长持续时间。

以下结构有一个state变量:

我从上述规则中了解到,给定的线程在给定的时间内不能具有相同的状态。

那么我如何监控一个结构以查看它是否在定义的秒数内具有相同的值?

如果哲学家 1 不能处于进食状态超过一秒钟并且他达到了那个极限,我可能会强迫他进入另一种状态。

代码似乎无关紧要,因为函数只是改变哲学家状态的条件。

0 投票
1 回答
911 浏览

c++ - 如何在 C++ 中增加信号量值,以解决哲学家用餐问题

试图通过创建一个门卫来解决哲学家就餐问题,只允许 4 位哲学家同时用餐,计划为此使用信号量,但网络上关于它们的资料有限,我不知道如何增加信号量的价值一旦发出信号。

主要的()

等待()

0 投票
1 回答
632 浏览

visual-studio-2010 - C++/cli 错误 C4368:无法将“列表”定义为托管“队列”的成员:不支持混合类型

我对 c++ Gui 完全陌生。我正在尝试制作一个简单的窗口表单来利用我的餐饮哲学家信号量解决方案

我的信号量头文件

我的信号量 cpp

我的队列头文件

队列 CPP

我不断收到错误 C4368:无法将“列表”定义为托管“队列”的成员:不支持混合类型,并且我没有使用 C++ Windows 窗体的实际经验

0 投票
0 回答
244 浏览

c - 餐饮哲学家测试僵局

我正在使用信号量在 c 中实现餐饮哲学家问题。我的代码有效,尽管我对为什么根本没有发生死锁感到困惑。

代码:

输出块:

我知道这是一件好事,但似乎我的线程一个接一个地执行而不是同时执行,这违背了线程的意义。

提前致谢!