哲学家吃饭问题*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿*时才试图分两次从两边拿起筷子就餐.*条
来源:学生作业帮助网 编辑:六六作业网 时间:2024/08/15 06:30:43
哲学家吃饭问题*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿*时才试图分两次从两边拿起筷子就餐.*条
哲学家吃饭问题
*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,
*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿
*时才试图分两次从两边拿起筷子就餐.
*条件:
*1)拿到两只筷子时哲学家才开始吃饭.
*2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子.
*3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子.
*要求:
*1)描述一 个保证不会出现两个邻座同时要求吃饭的通信算法.
*2)描述一个即没有两个邻座同时吃饭,有没有饿死(永远拿不到筷子)的算法
哲学家吃饭问题*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿*时才试图分两次从两边拿起筷子就餐.*条
#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