问题标签 [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++ - 如何初始化已经在 C++ 中声明的唯一锁?
我创建了一个类,并将一组唯一锁和一组互斥锁声明为私有变量。我的问题是如何在类的构造函数中连接它们两者?
头文件:
c++ 文件:
concurrency - 与 Ben Ari 的频道就餐哲学家陷入僵局?
在 Ben Ari 的《并发和分布式编程原理》(第 2 版)第 8.4 章,用通道吃饭的哲学家中,他们提出了一个我认为可能导致死锁的解决方案。
假设哲学家 3 拿了叉子 3。然后哲学家必须拿第四叉子吃饭。但是第四个叉子可能会被第四个哲学家拿走。
作为概括,每个哲学家都可能先拿“他左边”的叉子,导致他们每个人都在等待另一个叉子被释放,这永远不可能发生。
我错过了什么,还是这个解决方案不完整?
在关于信号量的章节中,也发生了类似的事情,但作者提出了一种替代解决方案来缓解死锁情况。例如,可以添加一个限制,让一位哲学家首先在其他人做的另一侧分叉,从而避免死锁。我认为这可能是一个可能的解决方案,但我想在这里与其他人确认。
提前致谢!
c - (C) Dining Philosophers - 如何让并发线程等待条件满足?
我是一个初学者,我正在实施餐饮哲学家的问题。但是,我遇到了一个问题。在我的哲学家()函数中,我希望我的其他线程等到左右筷子可供它们使用。我应该如何实现这个?目前,程序只是在 2 位哲学家吃完后终止,而无需等待其他人吃完
我已经尝试过:
- 使用互斥锁来锁定 philosopher() 函数中的共享变量,虽然它可以确保没有哲学家挨饿,但使用这种方法意味着放弃并发性(即使有筷子可供其他哲学家使用,也只有一个哲学家可以同时进食)利用)
- 在我的 while 循环中使用 sleep() 函数,但它也不起作用
任何帮助表示赞赏,谢谢!
代码
c - 使用互斥锁的餐饮哲学家饥饿问题
这里为哲学家就餐问题提供的解决方案指出:只有当左右筷子都可用时,才允许哲学家拿起筷子。我正在为该解决方案使用以下代码。然而,唯一的问题是存在饥饿的可能性。解决此问题的最有效解决方案是什么?
主程序
吃.c
哲学家.c
思考.c
餐饮.c
dp.h
生成文件
multithreading - Go 中的哲学家就餐问题未通过单元测试
我正在学习围棋课程,其作业如下:
使用以下约束/修改来实现餐饮哲学家的问题。
应该有 5 个哲学家共用筷子,每对相邻的哲学家之间有一根筷子。
每个哲学家应该只吃 3 次(而不是像我们在讲座中那样无限循环)。
哲学家按任何顺序拿起筷子,而不是从最低的先拿起筷子(我们在讲座中做过)。
为了吃饭,哲学家必须得到在自己的 goroutine 中执行的主机的许可。
主人允许不超过 2 位哲学家同时用餐。
每个哲学家都有编号,从 1 到 5。
当一个哲学家开始吃饭时(在获得必要的锁之后),它会在一行上单独打印“开始吃饭”,其中是哲学家的编号。
当哲学家吃完饭(在它释放它的锁之前)它会在一行上单独打印“finishing eating”,其中是哲学家的编号。
我的实现:
单元测试:
问题是,测试随机失败。下面是一个执行(添加了行号):
哲学家 4 已从第 10 行和第 24 行开始,并在第 11、18 和 28 行结束。第 28 行不匹配,因此测试正确地抱怨。但是,我很难找到错误。你能帮我吗?
c# - 一个接一个地使用两个锁语句是否安全?
我一直在学习多线程编程并致力于解决哲学家就餐问题。我试图在不休眠任何线程的情况下造成死锁。这是我正在使用的代码片段:
在尝试了几次之后,我没有看到任何死锁。我知道没有遇到死锁并不意味着这段代码是线程安全的。例如,当我更改锁定语句并添加延迟时,我会导致死锁。
我有两个问题:
- 一个接一个地使用两个锁语句是原子操作吗?
- 如果使用 Thread.Sleep() 导致代码片段死锁,这是否意味着代码片段不是线程安全的?
谢谢!
c - 为什么即使 sem_t 值为零,sem_wait() 功能块也不行?
我正在尝试为哲学家就餐问题(有五个哲学家)实现一个简单的解决方案,我的解决方案基于这个逻辑:
每个哲学家首先思考不到三秒钟
然后,如果右筷子可用,哲学家会拿走它,如果还有左筷子可用,哲学家也会拿走筷子并开始吃不到三秒钟
然后哲学家会放下筷子,让其他哲学家使用
为了避免循环等待,对于最后一位哲学家,我将先选择左筷子,然后选择右筷子,然后继续相同的过程
这是我基于此逻辑实现的代码:
但是在调试这段代码的过程中发生了一个问题,之前chopstick[i]
没有阻塞当前线程,直到筷子可用,所以哲学家开始在没有实际筷子的情况下吃饭。0
sem_wait(&chopstick[num])
sem_wait()
谁能帮我弄清楚我的问题在哪里?
c - C中结构内部数组的动态内存分配
我正在用 C 语言做餐饮哲学家的任务。并在我的代码一开始就卡住了。
我决定每个哲学家都是结构,叉子是 int 数组。
但是我不能在这个赋值中使用全局变量。
因此,我必须在哲学家结构中包含共享变量,以将它们传递给线程例程的参数。
这是我的问题 - 如果我在初始化时不知道它们的正确大小,如何在结构中包含 int 数组?
我的计划只是在结构中包含指针变量,然后使用 & 分配数组的地址。
但它不起作用:
输出:分段错误
我像这样测试了 share->forks 大小:
输出为 8。它的大小足以存储 int * 指针。通过这个我知道这不是内存分配问题。
那么问题是什么?有人可以帮我检查一下吗?
编辑:当我尝试直接 malloc philo->share->forks 时,我得到了同样的错误。
我认为这是因为当 philo 初始化时, sizeof 运算符计算出 forks 的内存为 8 - 这是指针所必需的。
有什么不对?
编辑2:要清除我的问题,
如果我在结构定义中写数组的大小,就很容易解决这个问题。
但根据我的任务,我必须从 cmd 获取哲学家的号码。所以我不能那样做。以上是我的原始代码的简单版本
抱歉,编辑 2 错误:
输出
当我在结构定义中写入数组大小时,我仍然遇到段错误。
我使用 calloc 来初始化结构中的所有成员,但发生同样的错误:
编辑4:我终于发现了错误。这是因为我没有在 philo struct 中 malloc 'share' struct
那一行 - 分配结构共享 - 解决了问题。
或者,我可以像这样修改 philo 结构定义:
这样,我就可以自动 malloc struct 共享了。
我在这一点上感到困惑。感谢您的帮助!
java - Java中的多线程解决死锁
我遇到了线程死锁问题。似乎问题在于线程如何工作。我这里有 2 个问题。
虽然我创建了 5 个线程并启动它们,但并非所有线程都调用
run()
. 这是随机的,但我不知道为什么。in main 方法有问题,
while()
即使我设置了结束条件,我的代码也会无限运行。
如果你能帮助我,那就太好了。
这是我的班级筷子
这是我的哲学家班(又名线程)。我使用了资源层次的解决方案,奇数哲学家需要先拿起左边的筷子,然后是右边的筷子,偶数拿起右边的筷子。
我的主要课程: