哲学家就餐问题
场景:5个哲学家,5把叉子,5盘意大利面(意大利面很滑,需要两把叉子才能拿起)大家围绕桌子,进行思考与进食的活到,如下图所示。
哲学家的活动方式为:要么放下左右手刀叉进行思考,要么拿起刀叉开始吃饭(刀叉拿起时,必须拿两把,而且只能左右手依次拿,先左手拿左边,后右手拿右边,或者先右手拿右边,左边拿左边)。其只有这两种交替状态。
//描述每个哲学家的状态 #define N 5 //哲学家个数 #define LEFT (i+N-1)%N //第i个哲学家的左邻居 #define RIGHT (i+1)%N //第i个哲学家的右邻居 #define THINKING 0 //思考状态 #define HUNGRY 1 //饥饿状态 #define EAT 2 //进餐状态 int state[N]; //记录每个人状态 // semaphore mutex = 1; //互斥信号量,初值1 //一个哲学家吃饱后,可能要唤醒邻居,存在同步关系 semaphore s[N] = {0}; //同步信号量,初值0 void philosopher(int i) { while(true) { think(); take_forks(i); eat(); put_forks(i); } } void take_forks(int i); { P(mutex); //进入临界区 state[i]=HUNGRY; //设置状态,饿了 test_take_left_right_forks(i); //试图获取两把叉子 V(mutex); //退出临界区 P(s[i]); //没有叉子便阻塞 } void put_forks(int i); { P(mutex); //进入临界区 state[i]=THINKING; test_take_left_right_forks(LEFT); //左邻居是否可以进餐 test_take_left_right_forks(RIGHT);//右邻居是否可以进餐 V(mutex); //退出临界区 } void test_take_left_right_forks(int i) { if(state[i] == HUNGRY && state[LEFT] != EAT && state[RIGHT] != EAT) { state[i]=EAT; //两把叉子获得了 V(s[i]); //通知第i号哲学家可以吃饭了 } } void think(int i) { } void eat(int i) { }
posted on 2022-01-08 14:45 BraveMrFeng 阅读(91) 评论(0) 收藏 举报
浙公网安备 33010602011771号