网上找得哲学家就餐问题的一段据说不错的代码

这个段程序并不是我写的,在思考问题上参考了这个,觉得很不错,简单易懂。所以上传仅供大家学习。

我忘记这个程序是从哪里得到的,但是感谢提供者。

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
enum State {THINK,WAIT,EAT,END};//哲学家所处状态
bool p(int &a);
bool v(int &a);
class phi//哲学家
{
public:
     phi();
     ~phi();
     void again();//让哲学家回到构造时的状态
     int living(int &r,int &l);//哲学家活着在
     State getsta();//返回哲学家状态
     int getinlet();//得到入口
     void print();//输出状态
private:
     State sta;//哲学家状态
     int inlet;//入口。哲学家应该在做什么?
};
int main()
{
     srand((unsigned)time(NULL));
     phi p[5];//5个哲学家
     int cho[5]={1,1,1,1,1};//5根筷子
     int check1,check2,n=0;char c;
     cout<<"输入y看死锁情况!"<<endl;
     cin>>c;
     while(true)
     {
         int i;
         check1=0;check2=0;//check1检察状态是否全为等待,check2检验是否全部吃完
         for(i=0;i<5;i++)
         {
             if(c=='y')p[i].living(cho[i],cho[(i+4)%5]);
             else{
             if(i%2==0)p[i].living(cho[i],cho[(i+4)%5]);//偶数号先右后左
             else p[i].living(cho[(i+4)%5],cho[i]);//奇数号先左后右
             }
         }
         cout<<setw(8)<<"哲学家:";
         for(i=0;i<5;i++)p[i].print();
         cout<<endl;
         cout<<setw(8)<<"筷子:"<<"    ";
         for(i=0;i<5;i++)
         {
             cout<<setw(8)<<cho[i];
             if(p[i].getsta()==WAIT)check1++;
             if(p[i].getinlet()==10)check2++;//等于12时筷子都交公完了!
         }
cout<<endl;
         if(check1==5){
             cout<<"死锁!!!!"<<endl;
             break;
         }
         if(check2==5){
             if(c=='y'){
                 n++;
                 cout<<"第"<<n<<"次..."<<endl;
                 for(i=0;i<5;i++)p[i].again();
             }
             else{
             cout<<"都吃完饭了!!!"<<endl;
             break;
             }
         }
     }
     return 0;
}
bool p(int &a)
{
     if(a==1){
         a--;
         return true;
     }
     else return false;//由于同用一根筷子的人数只有两个,全局看,程序不用设等待队列
}
bool v(int &a)
{
     a++;
     return true;//能交出来,你手上肯定有筷子。
}
phi::phi()
{
     sta=THINK;
     inlet=0;
}
phi::~phi()
{
}
void phi::again()
{
     sta=THINK;
     inlet=0;
}
int phi::living(int &r,int &l)
{
     if(inlet==0){
         int p1=rand()%2;
         if(p1==1)inlet++;//肚子饿了,要开吃了!!!!
     }
     else if(inlet==1){
         if(p(r)){//申请筷子
             sta=WAIT;
             inlet++;//如果分配成功则进入下一阶段,否则等待下次申请
         }
     }
     else if(inlet==2){
         if(p(l)){//申请筷子
             sta=EAT;
             inlet++;//分配成功。进入下一阶段
         }
     }
     else if(inlet>2&&inlet<7){//相当于吃饭需要吃一段时间
         inlet++;
     }
     else if(inlet==7){
         int p2=rand()%2;
         if(p2==1)inlet++;//决定哲学家是否还要断续吃
     }
     else if(inlet==8){
         sta=END;//终于吃完了,交出筷子吧
         v(l);
         inlet++;
     }
     else if(inlet==9){//加到11就执行
         v(r);
         inlet++;
     }
     else ;//??
     return 0;
}
State phi::getsta()
{
     return sta;
}
int phi::getinlet()
{
     return inlet;
}
void phi::print()
{
     if(sta==THINK){cout<<setw(8)<<"思考";}
     else if(sta==WAIT){cout<<setw(8)<<"等待";}
     else if(sta==EAT){cout<<setw(8)<<"用餐";}
     else {cout<<setw(8)<<"吃完";}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值