哲学家进餐问题的产生背景

作者&投稿:臧明 (若有异议请与网页底部的电邮联系)
哲学家进餐问题~

我们自己考试上交的哲学家进餐程序
#include
#include
#include
void main()
{
int x1,x2;//1-5的随机数
int i,N;//N循环次数
int flag=-1;//flag记录信号量的全局变量
printf("请输入循环次数N:");
scanf("%d",&N);
for(i=1;i<=N;i++)
{
x1=rand()%5+1;
if(flag==-1)
{
printf("
第%d次循环第%d个哲学家可以单独进餐!",i,x1);
flag=x1;
}
x2=rand()%5+1;
if(flag==-1)
{
printf("
第%d次循环第%d个哲学家可以单独进餐!",i,x2);
flag=x2;
}
else if(abs(flag-x2)==2||abs(flag-x2)==3)
{
printf("
第%d次循环第%d个和第%d个哲学家可以同时进餐!",i,flag,x2);
flag=x2;
}
else
printf("
第%d次循环第%d个哲学家思考!",i,x2);
printf("
");
}
}

#include
#include
#define people 5
#define meat 10 //肉块的数量


static int Tman[people];
int n = 1; //定义n为共吃肉的数量

/////////////////////定义一些需要跟哲学家对应的数组///////////////////////
static int Thinking[people]; //第n个哲学家在思考。如果为1就是真,0就假s
static int Eating[people]; //第n个哲学家在吃。1为真,0为假
static int EatTimeAll[people];
static int EatTime[people];
static int MeatNo[people];

int getkey(int i)
{
//key();
if(i!=1)
{
if(i%2 != 0) //奇数就从左手开始拿筷子,然后再到右手。
{
if(Tman[i-1] == 0) //i-1为第i个哲学家的左边的筷子0表示该筷子可用,1表示正在被用
{
Tman[i-1] = 1;
if(Tman[i] == 0)
{
Tman[i] = 1;
return 1;
}
else
{
Tman[i-1] = 0;
return 0;

}
}
else
{

return 0;

}
}
else //偶数先从右手开始拿筷子。
{
if(Tman[i] == 0) //i-1为第i个哲学家的左边的筷子0表示该筷子可用,1表示正在被用
{
Tman[i] = 1;
if(Tman[i - 1] == 0)
{
Tman[i - 1] = 1;
return 1;
}
else
{
Tman[i] = 0;
return 0;

}
}
else
{

return 0;

}
}
}
else
{
if(Tman[5] == 0)
{
Tman[5] = 1;
if(Tman[1] == 0)
{
Tman[1] = 1;
return 1;
}
else
{
Tman[5] = 0;
return 0;
}

}
else
{
return 0;
}
}

}

void eat() //n表示要吃的第n块肉
{
int i;

for(i=1;i<=people;i++)
{
int want; //想吃肉的哲学家
want = 1 + rand()%5;
if(getkey(want) && n<=meat)
{
Eating[want] = 1;
Thinking[want] = 0;
printf("第%d个哲学家开始吃第%d块肉
",want,n);
MeatNo[want] = n;
EatTimeAll[want] = 1 + rand() % 3; //哲学家不会无止境的吃下去的,
//EatTime[i] = EatTimeAll[i]; //我设以3分钟内的随机时间为
n++;
}

}

}

void eatting()
{
int i;
for(i=1;i<=5;i++)
{

if(Eating[i] == 1)
{
EatTime[i]++;
printf("第%d个哲学家正在吃第%d块肉,共需%d秒,已用%d秒
",i,MeatNo[i],EatTimeAll[i],EatTime[i]);
}
if(EatTime[i] == EatTimeAll[i] && EatTime[i] != 0)
{
printf("第%d个哲学家已经吃完第%d块肉
",i,MeatNo[i]);
MeatNo[i] = 0;
Tman[i-1] = 0;
Tman[i] = 0;
Eating[i] = 0;
Thinking[i] = 1;
EatTime[i] = 0;
}

}
}

void thinking()
{
int i;
for(i=1;i<=5;i++)
{
if(Thinking[i])
{
printf("第%d个哲学家正在思考。
",i);
}
}
}


void main()
{
int i,time;

//初始化
for( i=1 ; i <= people ; ++i )
{
Tman[i] = 0;
EatTime[i] = 0;
Eating[i] = 0;
Thinking[i] = 1;

}


time = 0;
for(;n<=meat;)
{
++time;
printf("=================这是第%d秒的开始==================
",time);
eat();
thinking();
/ Time();
eatting();
printf("=================这是第%d秒的结束==================

",time);
}
printf("哈哈,盘子里已经没有肉了.
");
}



本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/Bilicon/archive/2006/05/12/726798.aspx

由荷兰学者Dijkstra提出的哲学家进餐问题(The Dinning Philosophers Problem)是经典的同步问题之一。哲学家进餐问题是一大类并发控制问题的典型例子,涉及信号量机制、管程机制以及死锁等操作系统中关键问题的应用,在操作系统文化史上具有非常重要的地位。对该问题的剖析有助于深刻地理解计算机系统中的资源共享、进程同步机制、死锁等问题,并能熟练地将该问题的解决思想应用于生活中的控制流程。




关于操作系统 哲学家吃饭的问题 ,不需要编程,只要帮我解释一下,用信号...
repeat wait(chopstick〔i〕);wait(chopstick〔(i+1) mod 5〕);eat;signal(chopstick〔i〕);signal(chopstick〔(i+1) mod 5〕);think;until false;存在的问题?上述方法可以保证不会有两个相邻的哲学家同时进餐,但有可能产生死锁。假如五个哲学家同时饥饿而各自拿起左边的筷子时,就会使五个信号...

...型信号量写出一个不会出现死锁的哲学家进餐问题的算法.请各位高手们...
Var chopstick:array[0,…,4] of semaphore;void philosopher(int I){ while(true){ think();Swait(chopstick[(I+1)]%5,chopstick[I]);eat();Ssignal(chopstick[(I+1)]%5,chopstick[I]);} }

学生就餐考虑的因素
可以让孩子一边玩你一边喂,然后逐渐让孩子学会自己进食,先自己手抓再学习餐具使用。一开始孩子肯定会搞得乱七八糟,只要他喜欢,就多鼓励,不用在意他是否做的准确和自己进食了多少,最重要让他保持对进食这件事维持兴趣,让进食变成玩耍。再美味的食物,如果气氛紧张压抑,估计没有人会对它产生胃口。...

幼儿吃饭时注意力不集中
1. 良好的进餐习惯尚未形成 中、大班的孩子在进餐时常常表现出急于吃完、饭后整理草率等行为。有的孩子洗手不彻底,甚至忽略漱口就急着去参加其他活动。还有一些孩子吃饭时过于活跃,说话不停。这可能是因为他们的进餐能力提高了,开始发展有意行为,不希望落在别人后面。尽管他们知道良好的进餐习惯对身体...

有哪些著名的心理学实验
作者通过观察在不同白鼠密度环境下的白鼠的行为反应,发现拥挤会导致行为沦丧,对解决问题能力会产生消极影响。当科学家对攻击行为、不孕症、精神疾病或各种形式的社会冲突等问题进行进一步了解和干预研究时,常会参考卡尔霍恩关于拥挤和行为病理学的研究。33.为自己挑选心理治疗师(史密斯和格拉斯)作者通过搜集大量关于心理治疗...

有些专家建议,吃早餐要吃20分钟,中晚餐要吃30分钟,为什么他们这样建议...
生活在繁忙的大都市,大多数人可以用很多借口,比如睡得晚,没有时间准备早餐。那么,让我们看看营养学家是如何安排和准备他们自己的早餐的。或许可以为许多白领或家长提供参考。方法非常简单,即前一天晚上做三明治和喝牛奶,做煮鸡蛋或腌鸡蛋,切成两半,切黄瓜片,洗樱桃西红柿,第二天早上直接把鸡蛋\/腌...

外国名人故事:心理学家冯特的故事
威廉·冯特(Wilhelm Wundt,1832―1920),德国心理学家,哲学家,第一个心理学实验室的创立者,构造主义心理学的代表人物。他的《生理心理学原理》是近代心理学第一部最重要的着作。1866年冯特获得医学博士学位,1875年任莱比锡大学哲学教授,1879年在该校建立世界上第一座心理实验室。 有关冯特最令人吃惊的一件事是,...

家长该如何培养孩子好的进餐习惯呢?
食物的变换有助于小孩神经系统心理状态的生长发育,引入的环节应当特别注意塑造孩童的进食专业技能,从泥粘稠食物衔接到粉末状食物,可以协助训练咬合作用,宝宝用手抓食物既可以提升其进食的兴趣爱好,又有助于推动手眼协调能力。1岁之后需要让宝宝学习自身用厨具用餐,塑造他的单独能力,推动口腔科姿势融洽,...

计算机操作系统,筷子分配问题(哲学家进餐问题),请问图片里的是什么意思...
没给个题目介绍吗?筷子分配问题很简单,很容易看懂,建议你百度查找一片这方面的文章先看看就明白了!

进餐中应注意的问题有哪些?
进餐前的良好氛围、进餐环境的洁净优雅,会为幼儿进餐创造好的心情,是愉悦进餐的前提;进餐中,教师亲切、具体、适时的指导,在帮助幼儿习得进餐技能的同时,让幼儿吃上饭、吃好饭、吃得舒服;餐后的整理、盥洗又使幼儿形成健康的进餐习惯。因此,教师要针对进餐环节具体时段的不同,有效帮助和指导幼儿的...

开封县18444105262: 哲学家就餐问题的问题描述 -
牢闹华意: 哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考.吃东西的时候,他们就停止思考,思考的时候也停止吃东西.餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉.因为...

开封县18444105262: 哲学家就餐问题 -
牢闹华意: 设有5个哲学家,共享一张放油把椅子的桌子,每人分得一吧椅子.但是桌子上总共执友支筷子,在每个人两边分开各放一支.哲学家只有在肚子饥饿时才试图分两次从两边拾起筷子就餐. 就餐条件是: 1)哲学家想吃饭时,先提出吃饭的要求; 2)...

开封县18444105262: Ipc存在什么问题以及怎样解决存在的问题?高手请帮我解决一下啊,急着用啊! -
牢闹华意: 三个经典的IPC问题:1 哲学家进餐问题2 读者-写者问题3 理发师睡觉问题 一、 问题:有五个哲学家,每个哲学家面前有一盘面 每个哲学家左右各有一只筷子 哲学家有2个状态,思考或者拿起筷子吃饭.如果哲学家拿到一只筷子,不能吃饭,拿...

开封县18444105262: 卧室贴什么颜色的壁纸比较好?用什么牌子的呢? -
牢闹华意:首先是要看你卧室家具的色系及装修风格是什么样子的,然后再根据自己的喜好进行选择呢,建议还是要选择温馨的.贴壁纸的辅料只要你选对了牌子就行,嘉利丰的就不错的.这边给你一些色彩搭配的建议,希望对你有帮助哦不同颜色带给...

开封县18444105262: 哲学家就餐问题设有5个哲学家,共享一张放有五把椅子的桌子,每人分得一把椅子.但是,桌子上总共只有5支筷子.在每人两边分开各放一支.哲学家饥饿... -
牢闹华意:[答案] 规定在拿到左侧的筷子后,先检查右面的筷子是否可用.如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程. 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都...

开封县18444105262: 关于哲学家进餐问题 -
牢闹华意: 筷子是放在两人中间的,也就是说1号筷子放在1、2号哲学家之间.对于1号哲学家而言,1号筷子在他左边,而4号筷子在他右边. 这个解释起来是很难描述. 先说死锁发生时的状态,任何人都占有且公占有1根筷子,导致1等2, 2等3, 3等4, ... ,...

开封县18444105262: 用AND描述哲学家进餐问题 -
牢闹华意: 1. 哲学家进餐问题: (1) 在什么情况下5 个哲学家全部吃不上饭? 考虑两种实现的方式,如下: A. 算法描述: void philosopher(int i) /*i:哲学家编号,从0 到4*/ { while (TRUE) { think( ); /*哲学家正在思考*/ take_fork(i); /*取左侧的筷子*/ take_...

开封县18444105262: “哲学家就餐问题”的思路是什么? -
牢闹华意:[答案] 有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左...

开封县18444105262: 哲学家吃饭问题 -
牢闹华意: #include <stdio.h>#include <stdlib.h>#define people 5#define meat 10 //肉块的数量 static int Tman[people]; int n = 1; //定义n为共吃肉的数量/////////////////////定义一些需要跟哲学家对应的数组/////////////////////// static int Thinking[people]; //第n个哲学家...

开封县18444105262: 哲学家就餐问题为什么左筷子是i,右筷子是(i+1)%5?右筷子这么表示是什么意思
牢闹华意: 就是逻辑上右边的那一根筷子%5的原因是为了防止出现筷子编号超出范围,即4号的下一根是0号不是5号

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网