您当前的位置: 首页 > 

光怪陆离的节日

暂无认证

  • 2浏览

    0关注

    1003博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

22哲学家进餐问题

光怪陆离的节日 发布时间:2021-01-14 08:13:07 ,浏览量:2

哲学家进餐问题:一张圆桌有5名哲学家,每个哲学家之间的桌子上摆一根筷子,桌子中间是一碗米饭。哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左右两根筷子。如果筷子已经在他人手上,则等待。饥饿的哲学家只有同时拿到两个筷子才能开始进餐,进餐完放下筷子继续思考。 在这里插入图片描述

1、 关系分析:5名哲学家与左右邻居对其中间筷子的访问是互斥关系。 2、 整理思路:显然这里有五个进程。关键是如何让一个哲学家拿到左右两个筷子不造成死锁或者饥饿现象。解决方法有两个,一个是让他们同事拿两个筷子;二是对没和哲学家动作制定规则,避免饥饿或死锁的现象发生。 3、 信号量设置。Chopstick[5]={1,1,1,1,1}用于对5个筷子的互斥访问。 4、 对哲学家按顺序从0~4编号,哲学家i左边的筷子编号为i,哲学家右边的筷子编号为(i+1)%5 Semaphore chopstick[5]={1,1,1,1,1}; //定义信号量数组chopstick[5],并初始化 Pi(){ //i号哲学家的进程 Do{ P(chopstick[i]); //取左边筷子 P(chopstick[(i+1)%5]); //取右边筷子 Eat; //进餐 V(chopstick[i]);//放回左边筷子 V(chopstick[(i+1)%5]); //放回右边筷子 Think; //思考 }while(1); } 该算法存在的问题是都拿起左边筷子的时候,就会全部阻塞,出现死锁 5、 正确的制定规则如下:当哲学家左右两边的筷子都可以用时,才允许他抓起筷子 描述代码如下: Semaphore chopstick[5]={1,1,1,1,1}; //初始化信号量 Semaphore mutex=1; //设置取筷子的信号量 Pi(){ //i号哲学家的进程 Do{ P(mutex); //在取筷子前获得互斥量 P(chopsick[i]);//取左边筷子 P(chopstick[(i+1)%5]);//取右边筷子 V(mutex); //释放取筷子的信号量 Eat; //进餐 V(chopstick[i]); //放回左边筷子 V(chopstick[(i+1)%5]); //放回右边筷子 Think; //思考 }while(1); }

关注
打赏
1665731445
查看更多评论
立即登录/注册

微信扫码登录

0.0618s