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

c++ - 如何初始化已经在 C++ 中声明的唯一锁?

我创建了一个类,并将一组唯一锁和一组互斥锁声明为私有变量。我的问题是如何在类的构造函数中连接它们两者?

头文件:

c++ 文件:

0 投票
1 回答
62 浏览

concurrency - 与 Ben Ari 的频道就餐哲学家陷入僵局?

在 Ben Ari 的《并发和分布式编程原理》(第 2 版)第 8.4 章,用通道吃饭的哲学家中,他们提出了一个我认为可能导致死锁的解决方案。在此处输入图像描述 假设哲学家 3 拿了叉子 3。然后哲学家必须拿第四叉子吃饭。但是第四个叉子可能会被第四个哲学家拿走。

作为概括,每个哲学家都可能先拿“他左边”的叉子,导致他们每个人都在等待另一个叉子被释放,这永远不可能发生。

我错过了什么,还是这个解决方案不完整?

在关于信号量的章节中,也发生了类似的事情,但作者提出了一种替代解决方案来缓解死锁情况。例如,可以添加一个限制,让一位哲学家首先在其他人做的另一侧分叉,从而避免死锁。我认为这可能是一个可能的解决方案,但我想在这里与其他人确认。

提前致谢!

0 投票
2 回答
140 浏览

c - (C) Dining Philosophers - 如何让并发线程等待条件满足?

我是一个初学者,我正在实施餐饮哲学家的问题。但是,我遇到了一个问题。在我的哲学家()函数中,我希望我的其他线程等到左右筷子可供它们使用。我应该如何实现这个?目前,程序只是在 2 位哲学家吃完后终止,而无需等待其他人吃完

我已经尝试过:

  • 使用互斥锁来锁定 philosopher() 函数中的共享变量,虽然它可以确保没有哲学家挨饿,但使用这种方法意味着放弃并发性(即使有筷子可供其他哲学家使用,也只有一个哲学家可以同时进食)利用)
  • 在我的 while 循环中使用 sleep() 函数,但它也不起作用

任何帮助表示赞赏,谢谢!

代码

0 投票
0 回答
78 浏览

c - 使用互斥锁的餐饮哲学家饥饿问题

这里为哲学家就餐问题提供的解决方案指出:只有当左右筷子都可用时,才允许哲学家拿起筷子。我正在为该解决方案使用以下代码。然而,唯一的问题是存在饥饿的可能性。解决此问题的最有效解决方案是什么?

主程序

吃.c

哲学家.c

思考.c

餐饮.c

dp.h

生成文件

0 投票
1 回答
80 浏览

multithreading - Go 中的哲学家就餐问题未通过单元测试

我正在学习围棋课程,其作业如下:

使用以下约束/修改来实现餐饮哲学家的问题。

  • 应该有 5 个哲学家共用筷子,每对相邻的哲学家之间有一根筷子。

  • 每个哲学家应该只吃 3 次(而不是像我们在讲座中那样无限循环)。

  • 哲学家按任何顺序拿起筷子,而不是从最低的先拿起筷子(我们在讲座中做过)。

  • 为了吃饭,哲学家必须得到在自己的 goroutine 中执行的主机的许可。

  • 主人允许不超过 2 位哲学家同时用餐。

每个哲学家都有编号,从 1 到 5。

当一个哲学家开始吃饭时(在获得必要的锁之后),它会在一行上单独打印“开始吃饭”,其中是哲学家的编号。

当哲学家吃完饭(在它释放它的锁之前)它会在一行上单独打印“finishing eating”,其中是哲学家的编号。

我的实现:

单元测试:

问题是,测试随机失败。下面是一个执行(添加了行号):

哲学家 4 已从第 10 行和第 24 行开始,并在第 11、18 和 28 行结束。第 28 行不匹配,因此测试正确地抱怨。但是,我很难找到错误。你能帮我吗?

0 投票
0 回答
58 浏览

c# - 一个接一个地使用两个锁语句是否安全?

我一直在学习多线程编程并致力于解决哲学家就餐问题。我试图在休眠任何线程的情况下造成死锁。这是我正在使用的代码片段:

在尝试了几次之后,我没有看到任何死锁。我知道没有遇到死锁并不意味着这段代码是线程安全的。例如,当我更改锁定语句并添加延迟时,我会导致死锁。

我有两个问题:

  1. 一个接一个地使用两个锁语句是原子操作吗?
  2. 如果使用 Thread.Sleep() 导致代码片段死锁,这是否意味着代码片段不是线程安全的?

谢谢!

0 投票
1 回答
83 浏览

c - 为什么即使 sem_t 值为零,sem_wait() 功能块也不行?

我正在尝试为哲学家就餐问题(有五个哲学家)实现一个简单的解决方案,我的解决方案基于这个逻辑:

每个哲学家首先思考不到三秒钟

然后,如果右筷子可用,哲学家会拿走它,如果还有左筷子可用,哲学家也会拿走筷子并开始吃不到三秒钟

然后哲学家会放下筷子,让其他哲学家使用

为了避免循环等待,对于最后一位哲学家,我将先选择左筷子,然后选择右筷子,然后继续相同的过程

这是我基于此逻辑实现的代码:

但是在调试这段代码的过程中发生了一个问题,之前chopstick[i]没有阻塞当前线程,直到筷子可用,所以哲学家开始在没有实际筷子的情况下吃饭。0sem_wait(&chopstick[num])sem_wait()

谁能帮我弄清楚我的问题在哪里?

0 投票
2 回答
72 浏览

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 共享了。

我在这一点上感到困惑。感谢您的帮助!

0 投票
0 回答
37 浏览

java - Java中的多线程解决死锁

我遇到了线程死锁问题。似乎问题在于线程如何工作。我这里有 2 个问题。

  1. 虽然我创建了 5 个线程并启动它们,但并非所有线程都调用run(). 这是随机的,但我不知道为什么。

  2. in main 方法有问题,while()即使我设置了结束条件,我的代码也会无限运行。

如果你能帮助我,那就太好了。

这是我的班级筷子

这是我的哲学家班(又名线程)。我使用了资源层次的解决方案,奇数哲学家需要先拿起左边的筷子,然后是右边的筷子,偶数拿起右边的筷子。

我的主要课程: