从操作系统概念
5.8.2使用显示器的餐饮哲学家解决方案
接下来,我们通过对用餐哲学家问题提出一个无死锁的解决方案来说明监控概念。这个解决方案施加了一个限制,即哲学家只有在筷子都可用的情况下才能拿起筷子。为了给这个解决方案编码,我们需要区分我们可能找到哲学家的三种状态。为此,我们引入以下数据结构:
enum {THINKING, HUNGRY, EATING} state[5];
哲学家只有当她的两个邻居不吃饭时,我才能设置变量state[i]=EATING:
(state[(i4)%5]!=吃)
和(州[(i 1)%5]!=吃)
。
我们还需要申报
condition self[5];
这使得哲学家i在饥饿但无法获得所需筷子时可以拖延时间。
monitor DiningPhilosophers
{
enum {THINKING, HUNGRY, EATING} state[5];
condition self[5];
void pickup(int i) {
state[i] = HUNGRY;
test(i);
if (state[i] != EATING)
self[i].wait();
}
void putdown(int i) {
state[i] = THINKING;
test((i + 4) % 5);
test((i + 1) % 5);
}
void test(int i) {
if ((state[(i + 4) % 5] != EATING) &&
(state[i] == HUNGRY) &&
(state[(i + 1) % 5] != EATING)) {
state[i] = EATING;
self[i].signal();
}
}
initialization code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
}
图5.18问题的监视器解决方案。
每个哲学家在开始进食之前,必须调用操作
pickup()
。这一行为可能导致程序暂停。手术成功后,哲学家可以吃东西。接下来,哲学家调用putdown()
操作。
DiningPhilosophers.pickup(i);
...
eat
...
DiningPhilosophers.putdown(i);
很容易证明这个解决方案确保没有两个邻居同时吃饭,也不会发生死锁。
然而,我们注意到,哲学家有可能饿死。我们不提供这个问题的解决方案,而是将其留给您作为练习。
为什么显示器解决方案没有死锁?
为什么哲学家可能饿死?
这个问题的解决方案是什么?
谢谢
要理解为什么两个邻居不能同时吃饭,请看一下test(inti)
方法。这是唯一一个哲学家的状态设置为吃的地方:
if ((state[(i + 4) % 5] != EATING) &&
(state[i] == HUNGRY) &&
(state[(i + 1) % 5] != EATING)) {
state[i] = EATING;
self[i].signal();
}
前面的if条件确保,对于任何哲学家来说,其邻居(i4)%5
和(i1)%5
都没有进食。
饥饿是可能的,因为signal()是不公平的:它随机唤醒任何等待的线程,因此可能在任意长时间内不会唤醒某个线程。
这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18
下面是问题的链接:SPOJ-ACTIV 我想出了这个问题的重现如下: 其中next()查找具有开始时间的活动的索引 这是我的java解决方案,虽然它通过了SPOJ工具包的许多测试用例,但是它确实为一些提供了WA。我的概念/解决方案有什么问题?
本文向大家介绍ASP中只有UrlEncode,没有Urldecode问题的解决方法?,包括了ASP中只有UrlEncode,没有Urldecode问题的解决方法?的使用技巧和注意事项,需要的朋友参考一下 在ASP中传递参数时有一个很有用的系统函数Server.UrlEncode,可以将一些非字母数字的特殊符号转换成标准URL编码(其实就是16进制ASC码),这样就解决了参数传递问题,然后我以为也提
这是hackerrank(https://www.hackerrank.com/challenges/coin-change)的硬币更换问题。它要求计算使用给定面值的硬币对N进行更改的方法总数。 例如,有四种方法可以使用面额为1、2和3的硬币兑换4。它们是-
问题内容: 有任何想法吗?为什么节点说“文件名未定义”?谢谢。合同,政策和发票功能不使用任何数据进行解析,仅使用resolve()。 问题答案: 首先,您不能写: (如果该函数返回 另一个 函数充当处理程序,则可以使用) 您必须写: 要么: 或者,如果一个函数应该处理其他函数的结果,则可能是这样: 作为参数传递给您的是函数,而不是调用函数的结果(在您的示例中这可能是一个承诺)。 我不知道这是否是您
问题内容: 我知道N + 1问题是执行一个查询以获取N个记录,执行N个查询以获取一些关系记录。 但是如何在Hibernate中避免这种情况? 问题答案: 假设我们有一个制造商类,与Contact有多对一关系。 我们通过确保初始查询能够获取在适当的初始化状态下加载所需对象所需的所有数据来解决此问题。一种方法是使用HQL提取联接。我们使用HQL 与fetch语句。这导致内部联接: 使用条件查询,我们可