问题标签 [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.
concurrency - 为什么并发写入的布尔值设置为假后仍然为真?
我正在用 Go 编写 Philosophers Dining 解决方案。我的解决方案很简单:检查两个分叉是否可用。如果是这样,两个都捡起来。如果没有,请两者都保留。
但是,我遇到了一个奇怪的并发错误,即使明确设置为 false,fork 的可用性仍然是 true。我Fork
的声明如下:
当 Philosopher 调用PickUp()
时,程序将等待互斥锁;如果此时分叉可用,Fork
则将其可用性布尔值设置为 false 并返回 true 以指示操作成功。
哲学家是这样写的:
(注意:该getLeftSpace()
函数已被排除,因为它的实现无关紧要;它只是获取左侧空间的索引。)
的实现Philosopher
非常简单:它检查是否可以获得第一个分叉。然后,它检查是否可以获得第二个分叉;如果不能,它会放下第一个叉子。如果可以,则将两者都保持 5 秒钟,然后将两者都放下。出于测试目的,我将其限制为两位哲学家。
但是,这不能正常工作。哲学家 0 拿起第一个叉子,然后是第二个叉子。我已验证这些分叉的可用性已设置为 false。至此,Philosopher 1 已被互斥锁锁定。但是,一旦 Philo 0 释放了互斥锁,Philo 1 就会进入该函数。
此时的预期结果是PickUp()
函数返回 false;由于叉子不再可用,因此无法拾取。但是,该功能不这样做;它返回 true 并允许 Philo 1 拿起叉子!
更神秘的是,当 Philo 1 去拿起分叉时,分叉的可用性是true
,即使 Philo 0 明确地将它们设置为 false!这是我的调试输出:
Philo 1 应该永远无法拿起叉子。由于 Philo 1 被互斥锁锁定,并且仅有的两个退出条件PickUp
是在可用性为假之后,因此分叉不可能可用。
然而确实如此。为什么是这样?我该如何解决这个问题?
java - Java中的内存泄漏?用信号量实现的餐饮哲学家
我似乎在 Java 中创建了内存泄漏,我什至没有意识到这是可能的。我根据 Andrew Tanenbaum 的《现代操作系统》一书中的一个数字,实现了哲学家就餐并发问题的一种解决方案。
只要不死锁并且不使任何线程饿死,它就可以正常工作。然而......在相当短的时间内它消耗了大约 1GB 的 RAM(基于观察 Windows 系统资源),然后 Eclipse 崩溃并显示一条消息Unhandled event loop exception
Java heap space
。
问题:
- 这是什么原因造成的?
- 我可以使用哪些工具(除了让我失败的逻辑推理)来回答这个问题?Java/内存分析等?我对 Eclipse 内置的调试器之外的此类工具缺乏经验。
SSCCE:
algorithm - 餐饮哲学家:Chandy-Misra 方法:如何避免僵局?
我正在尝试,但是有一个问题:在wiki中,该算法的第三点说:
当一个有叉子的哲学家收到请求消息时,如果叉子是干净的,他会保留叉子,但如果叉子脏了,他就会放弃。如果他把叉子送过来,他会在这样做之前清理叉子
我试图理解为什么这不会导致僵局?如果一位哲学家有一个干净的叉子,并等待从邻近的餐厅/哲学家那里得到另一个干净的叉子,而后者也在等待叉子,这可能会累积成僵局,对吗?一位哲学家总是在等待另一位哲学家的分叉?
ps:我是线程和并发的新手,把它当作一个学习项目。
编辑:给出叉子的实际位置,发布此消息以询问叉子是否应该是可变的。pLeft , pRight 是左右哲学家, fLeft 和 fRight 是左右叉子。
我还没有弄清楚在哪里同步它,但我觉得仍然需要同步。就像当两个用餐者时,说第一个和第三个向第二个哲学家要叉子。
concurrency - 餐饮哲学家的真实世界例子?
生产者/消费者和读者/作家很容易想到,但餐饮哲学家呢?N个进程和N个资源在什么样的情况下会在环形拓扑上相互交错?我可以想到 N 进程竞争 M 资源,但在这种情况下,每个进程可以使用任意两种资源。
wiki说 Dijkstra 用它来模拟计算机竞争磁带驱动器外围设备。这种情况在现代还存在吗?
c - 餐饮哲学家计划C
我正在用 5 个哲学家和 5 根筷子处理经典的哲学家就餐问题。我的作业是使用 1 个互斥锁和 5 个条件。我让它工作了,但我不知道为什么哲学家 1 从不吃东西,但 4,3,0 吃,2 吃两次。这是我的代码(对不起,长度):
c - 使用 pthread 的简单餐饮哲学家
我正在从事哲学家就餐计划。但是我遇到了一个问题,我的程序在所有哲学家都吃完之前就停止了,我不明白为什么。这是我现在的代码:
java - 调用两个同步方法时出现死锁
以上代码来自《七周七并发模型》一书。这本书说上面的代码有可能出现死锁,因为同步方法 updateProgress 调用了一个可能获取另一个锁的外来方法[onProgress]。由于我们在没有正确顺序的情况下获得了两个锁,因此可能会发生死锁。
谁能解释在上述情况下死锁是如何发生的?
提前致谢。
java - Netbeans,红色文本但没有错误
我正在尝试为餐饮哲学家实施解决方案。不确定我是否做得对。我的程序没有崩溃,但输出中出现红色文本,但没有错误代码。
错误示例:
在 (package_name).Phil.getrightFork(Phil.java:70) 第 70 行和第 46 行之间的错误替代项(这是调用 getrightFork 的行)
我已经用 getleftFork 交换了 getrightFork,但它总是选择 rightFork 作为错误
这是我正在使用的代码:自定义信号量:
主要的:
菲尔班:
c - 将信息传递给餐饮哲学家算法中的多个线程
我正在尝试为餐饮哲学家的问题创建多个线程并将不同的值传递给每个线程。但我收到此错误:
这是我的代码:
python - 哲学家就餐的非阻塞解决方案
我被要求在 python 中为哲学家就餐问题编写一个简单的解决方案。这本身似乎很简单,但由于我被要求编写一个非阻塞解决方案,所以有些困惑。我不确定在这种情况下这是什么意思。
有没有人能给我任何提示或指出我正确的方向?