1 / 14
文档名称:

哲学家就餐(PPT).ppt

格式:ppt   页数:14页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

哲学家就餐(PPT).ppt

上传人:分享精品 2015/10/14 文件大小:0 KB

下载得到文件列表

哲学家就餐(PPT).ppt

文档介绍

文档介绍:哲学家用餐
问题:
哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子进餐完毕,放下筷子继续思考。
五个人五只筷子该如何进行用餐啊
利用记录型信号量解决:
进分析可知,放在桌子上的筷子是临界资源,在一段时间内允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:
Var chopstick:array[0,…,4]of semaphore;
所有信号量均被初始化为1 ,第i位哲学家的活动课描述为:
repeat:
wait(chopstick[i]);
Wait(chopstick[(i+1)mod5);

eat;

signal(chopstick[i]);
signal(chopstick([i+1]mod5);

Think;
until false
但是这样有可能造成死锁,如何解决?
(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学
家能够进餐,最终总会释放出他所使用过的两支筷子,从而可
使更多的哲学家进餐. 其伪码是:
Semaphore chopstick[5]={1,1,1,1,1};
Semaphore room=4;
Void philosopher(int i)
{
while(true)
{
Think();
Wait(room); //请求进入房间进餐
wait(chopstick[i]);//请求左手边的筷子
wait(chopstick[(i+1)]%5); //请求右手边的筷子
eat();
signal(chopstick[(i+1)]%5);//释放右手边的筷子
singal(chopstick[i]);// 释放右手边的筷子
singal(room);
}
}
可采用以下几种解决方法来解决死锁:
(2)仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐. 其伪码:
Semaphore chopstick[5]={1,1,1,1,1};
Void philosopher(int I)
{
while(true)
{
Think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
(3)规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他 右边的筷子;,将是1,2号哲 学家竞争1号筷子,3, 竞争奇数号筷子,获得后,再去竞争偶数号筷子,:
Semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
While(true)
{
Think();
If(i%2==0) //偶数号哲学家,先右后左
{
Wait(chopstick[i+1]mod5);
Wait(chopsticl[i]);
eat();
signal(chopstick[(i+1)]mod5);
singal(chopstick[i]);
}
else
{
Wait(chopsticl[i]);
Wait(chopstick[i+1]mod5);
eat();
singal(chopstick[i]);
signal(chopstick[(i+1)]mod5);
}
}
经过分析,我们决定采用第三种方法来解决死锁问题,其主函数如下:
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秒的开始==================\n",time);
eat();
thinking();

eatting();
printf("=================这是第%d秒的结束==================\n\n",time);
}
printf("哈哈,盘子里已经没有肉了.\n");
}