前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6.哲学家就餐问题 原

6.哲学家就餐问题 原

作者头像
青木
发布2019-03-12 17:01:47
1.1K0
发布2019-03-12 17:01:47
举报

哲学家就餐问题

有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们公用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有5个碗和5支筷子。平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子又继续思考。

分析

  • 筷子是临界资源,在一段时间内只允许一个哲学家使用
  • 用一个信号量表示一支筷子,由这5个信号量构成信号量组。

var chopstick:array[0……4] of semaphor

  • 所有信号量被初始化为1

用记录型信号量解决哲学家进餐问题

第i个哲学家的活动可买描述为

repeat 
	wait(chopstick[i]);		//拿起左边筷子
	wait(chopstick[(i+1) mod 5]);	//拿起右边筷子
	...eat...
	singal(chopctick[i]);	//释放左边筷子
	singal(chopstick[(i+1) mod 5]);		//释放右边筷子
	...
	think;
	until false;

问题

假如5个哲学家同时饥饿而各自拿起左边的筷子,会使5个信号量均为0;当他们再试图拿起右边筷子时,都将无限期的等待。

解决方法

  • 至多4个人同时拿左边的筷子,保证至少有一个人可以进餐,最终释放筷子使更多的人进餐。
  • 仅当哲学家的左右两支筷子均可使用时,才允许他拿起筷子进餐。
  • 规定奇数号哲学家先拿起其左边的筷子,再拿左边的,偶数号哲学家则相反。即:1、2号人竞争1号筷子,3、4号人竞争3号筷子,即5个人都先竞争奇数号筷子,获得后再去竞争偶数号筷子,最后总会有某一人进餐。

用AND型信号量解决哲学家进餐问题

var chopstick:
	array[0...4] of semaphore := (1,1,1,1,1)

具体过程:

repeat 
	think;
	Swait(chopstick[(i+1) mod 5],chopstick[i]);
	eat
	SSingal(chopstick[(i+1) mod 5],chopctick[i]);
	think;
until false;

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 哲学家就餐问题
    • 分析
      • 用记录型信号量解决哲学家进餐问题
        • 问题
          • 解决方法
            • 用AND型信号量解决哲学家进餐问题
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档