6.哲学家就餐问题

哲学家就餐问题

有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们公用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有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;

转载于:https://my.oschina.net/u/1771419/blog/3008224

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值