使用信号量解决哲学家饥饿问题

本文介绍了如何利用信号量解决操作系统中的经典问题——哲学家进餐问题。通过设置信号量表示筷子,确保哲学家们能正确获取并释放筷子,避免死锁的发生。详细代码实现展示了每个哲学家取放筷子的过程,并提供了完整的代码链接供参考。
摘要由CSDN通过智能技术生成

问题背景

最近操作系统课上看见了哲学家饥饿问题,很感兴趣就在网上搜索了一下.

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

约束条件

(1)只有拿到两只筷子时,哲学家才能吃饭。

(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。

(3)任一哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。

这里写图片描述

问题的产生

如果5个哲学家同时拿起了左边的筷子,

那么5个哲学家同时又会请求右手边的筷子,

由于每个哲学家都只有一个筷子,无法进餐,又连续的请求右手边没有的筷子,就会一直进入等待的状态

这样5个哲学家就饿死了

在IPC进程通信中我们了解过,

我们可以把五个哲学家想象成五个进程

而那五个筷子就是临界区的临界资源

只有某个进程得到临界区的两个资源才能进行下去,否则会一直阻塞

那么就可以用一组 5个 信号量表示5个筷子

每个信号量的值为0或1 表示此筷子是否被使用中

代码实现

代码抽象

信号量数组={1,1,1,1,1};

每个哲学家编号为i

左手的筷子可以用:

i%5来表示

右手的筷子可以用

(i+1) % 5

当某个哲学家要吃饭时.将其左右手筷子的信号量从1变为0

waitfork( );

吃完后将其信号量从0变成1

freefork();

哲学家的动作

void philosopher_bug(int No)
{

    while(1)
    {
        printf(" name: %d ,i'm thinking n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值