}
六、实验结果
5
实验二:哲学家进餐
一:实验目的和要求
通过本实验,掌握经典的进程同步问题,能更好地理解进程同步概念及实现方法,能掌握如何描述这些经典问题,及他们之间的控制关系,找出相应的信号量,描述他们的流程,并注意避免死锁问题的发生:
(1) 能模拟出五个哲学家进餐;
(2) 在实验报告中要写出实验步骤及过程,实验结果及分析,要附程序及
算法。
二:实验预习要求
能明确哲学家进餐问题的含义及描述。
三:实验范例
(1) 实验内容
选择一经典同步算法——哲学家进餐问题,并编程实现;
(2) 实验说明
单一哲学家进餐时,若另外有哲学家要求进餐,当两者编号相差2或3
时,才可同时进餐,否则后者等待。并将筷子释放。
四:问题的描述及算法
有五个哲学家,他们的生活方式四交替地进行思考和进餐。哲学家们公用一张桌子,分别坐在周围的五张椅子上。在圆桌上有五个碗和五只筷子,平时哲学家进行思考,饥俄时便试图取用其左右最靠近她的筷子,只有在她拿到两只筷子时才能进餐,进餐毕,放下筷子进行思考。 算法描述如下:
1. 给五个哲学家编号为1,2,3,4,5;产生一个1~5之间的随机数,规定一次产生两个哲学家; 2. 设置一个全局变量,将上一次产生的信号量纪录在内,并判断此次与上次的编号是否相差2或3;若是,即可同时吃,并释放上一个哲学家的筷子,若不是,只释放上一个哲学家的筷子。 3. 作N次循环(N自己输入)
6
五:附程序
#include
bool tools[5]; //全局变量,用餐工具
CRITICAL_SECTION cs; //信号量, 在线程中使用,临界区 class Philosopher {
private: int number;
int status; /*标记当前哲学家的状态,0表示正在等待
(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/ public:
Philosopher(int num=0): status(2), number(num) { } const int find() {
return number; }
const int getinfo() { return status; }
void Change() ; //状态改变函数 void dead_lock(); };
void Philosopher::dead_lock() {
EnterCriticalSection (&cs) ; //进入临界区 string s; if(status==1) {
tools[number%5]=true;
// tools[(number-1)%5]=true; status=2; }
else if(status==2) {
status=0;
//tools[(number-1)%5]=false; //tools[(number-1)%5]=true; }
7
else if(status==0) {
tools[number%5]=false; tools[(number-1)%5]=false; status=1; }
LeaveCriticalSection (&cs) ; // cout<<\}
/////////
void Philosopher::Change() {
EnterCriticalSection (&cs) ; //进入临界区 if(status==1) //正在进餐 {
tools[number%5]=true; //放下左手工具 tools[(number-1)%5]=true; //放下右手工具 status=2; //改变状态为思考 }
else if(status==2) //思考中 {
status=0; //改变状态为等待 }
else if(status==0) //等待中 {
if(tools[number%5]&&tools[(number-1)%5]) //左右手两边工具均为 {
tools[number%5]=false; //拿起左手工具 tools[(number-1)%5]=false; //拿起右手工具 status=1; } }
LeaveCriticalSection (&cs) ; }
string print(Philosopher *pA) {
//pA->Change(); int i=pA->getinfo(); string str; if(i==0) str=\等待\else if(i==1) str=\就餐\
8
相关推荐: