哲学家吃饭问题*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿*时才试图分两次从两边拿起筷子就餐.*条
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/25 12:19:10
![哲学家吃饭问题*设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,*但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿*时才试图分两次从两边拿起筷子就餐.*条](/uploads/image/z/9343073-65-3.jpg?t=%E5%93%B2%E5%AD%A6%E5%AE%B6%E5%90%83%E9%A5%AD%E9%97%AE%E9%A2%98%2A%E8%AE%BE%E6%9C%895%E4%B8%AA%E5%93%B2%E5%AD%A6%E5%AE%B6%2C%E5%85%B1%E4%BA%AB%E4%B8%80%E5%BC%A0%E6%94%BE%E6%9C%895%E6%8A%8A%E6%A4%85%E5%AD%90%E7%9A%84%E6%A1%8C%E5%AD%90%2C%E6%AF%8F%E4%BA%BA%E5%88%86%E5%BE%97%E4%B8%80%E6%8A%8A%E6%A4%85%E5%AD%90%2C%2A%E4%BD%86%E6%98%AF%2C%E6%A1%8C%E5%AD%90%E4%B8%8A%E5%85%B1%E6%9C%895%E5%8F%AA%E7%AD%B7%E5%AD%90%2C%E5%9C%A8%E6%AF%8F%E4%BA%BA%E4%B8%A4%E8%BE%B9%E5%90%84%E6%94%BE%E4%B8%80%E5%8F%AA%2C%E5%93%B2%E5%AD%A6%E5%AE%B6%E4%BB%AC%E5%9C%A8%E8%82%9A%E5%AD%90%E9%A5%A5%E9%A5%BF%2A%E6%97%B6%E6%89%8D%E8%AF%95%E5%9B%BE%E5%88%86%E4%B8%A4%E6%AC%A1%E4%BB%8E%E4%B8%A4%E8%BE%B9%E6%8B%BF%E8%B5%B7%E7%AD%B7%E5%AD%90%E5%B0%B1%E9%A4%90.%2A%E6%9D%A1)
哲学家吃饭问题*设有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