问题标签 [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.
c - 在 Dining Philosophers 上使用 Pthread 显示死锁
我们有一个任务是显示与餐饮哲学家问题的僵局。我们已经编写了所有代码并且代码可以编译,但是在运行代码时,其中一位哲学家最终吃掉了。那么这是否意味着实际上不会发生死锁?
这是输出:输出
java - 在 Hibernate/C3P0 中处理连接池耗尽并避免死锁
我的旧应用程序遵循链来查询我的数据库:Spring Tx -> Hibernate -> C3P0
. 现在我需要在现有架构的基础上实现新功能。
我通常通过使用@Transactional
注释或手动调用PlatformTransactionManager
.
SessionFactory
有时,为了执行异步和大数据操作,我使用API打开一个无状态会话。我们从来没有遇到任何额外的问题,因为我们的线程池得到了很好的控制
第一次,我的要求是并行执行多个数据库操作以加快性能。我对此表示怀疑,因为我对多线程操作非常小心。
对于数据库中的每个实体,我可以在单独的线程上执行对帐操作。但是每个协调操作对它产生的两个线程中的每一个都使用一对连接。所以每个线程基本上有4个连接。
多线程课告诉学生为了防止死锁(吃哲学家问题),资源的获取应该是事务性的:一旦你获得了一个fork,如果你不能在合理的时间内获得第二个,释放第一个重试.
我的问题很简单。给定SessionFactory
API,如果池已满,我如何编写不会无限期等待来自 c3p0 的 4 个连接的代码?我的意思StatelessSession
是只有当有 4 个空间时我才需要 4 秒,否则我可以等待并重试。
据我所知,SessionFactory
API 是阻塞的,不允许设置看门狗
java - 使用信号量在 Java 中用餐哲学家
我想使用 java 信号量来解决用餐哲学家的问题,但我被卡住了。最高 id 的筷子应该是可用的,但它似乎总是被拿走,我不知道为什么。谁能告诉我哪里出错了?
叉类:
哲学家班:
主要的:
java - 餐饮哲学家的解决方案陷入僵局
我已经为餐饮哲学家的问题实现了资源层次结构解决方案。当我尝试比较两个筷子的 n 值时,它们最终陷入僵局。但是,如果我使用他们的 hashCodes 而不是 n 值,它运行顺利。为什么会有这种差异?他们不是在一天结束时都是数字吗?
c - C `signal` 的参数太少
我正在解决一个问题,我应该实现一个餐饮哲学家范式的例子。注意:是的,这是一个家庭作业,在任何人问之前。
我不是在寻求解决方案。我很困惑,因为Philosopher
我的老师在下面提供的这个功能理论上应该可以工作。wait
并且signal
是 C 中用于 OS 系统调用的函数。
我使用以下方法将它们包括在内:
但是,编译时出现错误:
semaphore - 用信号量修改餐饮哲学家
在哲学家就餐问题的这个修改版本中,哲学家可以使用任何可用的叉子,而不仅仅是他左右的叉子。给出以下使用信号量对原始问题的解决方案
所以我希望对上面的伪代码进行简单的编辑,让哲学家可以使用5 个叉子中的任意2 个来吃饭。我的第一个想法是我可以删除其中的逻辑,test
并drop_chopsticks
检查是否,一旦我吃完,我的邻居现在可以吃……或者我可以吗?问题的这种变化似乎并不会使它复杂化,但我坚持如何准确地实现这一点。请注意,它仍然必须使用信号量并避免饥饿/死锁。
operating-system - Dining Philosophers 使用监视器实现
在使用监视器的 Dining Philosophers 实现中,为什么 putdown() 操作调用 test() 操作两次?
concurrency - 使用二进制信号量用餐哲学家
这个伪代码能以最大的并行度解决哲学家进餐问题吗?这mutex
是一个初始化为 1 的二进制信号量。假设分叉的编号从 0 到 (N-1)。从 0 到 (N-1) 共有 N 个哲学家。
这应该以最大的并行性解决哲学家进餐问题,因为在一位哲学家获得两个分叉后,锁就会被释放。但会吗?会不会有活力的问题?我很困惑。
concurrency - Dining-Philosopher's Monitor 解决方案:`pickup(i)` 是否需要间接调用`self[i].signal()`?
从操作系统概念
5.8.2 使用显示器的餐饮哲学家解决方案
接下来,我们通过提出一个解决哲学家进餐问题的无死锁解决方案来说明监视器的概念。这个解决方案施加了一个限制,即只有当两个筷子都可用时,哲学家才能拿起她的筷子。为了编写这个解决方案,我们需要区分可能找到哲学家的三种状态。为此,我们引入以下数据结构:
state[i] = EATING
只有当她的两个邻居不吃饭时,哲学家 i 才能设置变量:(state[(i+4) % 5] != EATING)
并且(state[(i+1) % 5] != EATING)
.我们还需要声明
这允许哲学家 i 在她饿了但无法获得她需要的筷子时延迟自己。
图 5.18 哲学家就餐问题的监视器解决方案。
每个哲学家在开始吃饭之前都必须调用这个操作
pickup()
。这一行为可能会导致哲学家进程的暂停。手术顺利完成后,哲学家就可以吃饭了。在此之后,哲学家调用该putdown()
操作。
pickup(i)
调用test(i)
,self[i].signal()
当条件满足时依次调用。是否pickup(i)
需要self[i].signal()
间接调用?
谢谢。
java - 使用“%”进行操作会产生意想不到的结果
我在餐饮哲学家问题上工作。为了使用我发现的这个循环分发叉子:
- i : 哲学家的号码
- forks[i]:右手的叉子。
- forks[(i + 1) % phthalsNumber] : 左手的前叉。
如果我在循环中添加一些打印,输出如下所示:
好吧,我的疑问很简单:为什么 (i+1) % 5 的结果总是与 i+1 相同,直到 i+1 为 5,即结果为 0?我想这与变量的类型有关,但我真的不知道。