带注释的伪代码深度剖析操作系统中的经典:哲学家就餐问题与读者写者问题全解

一、哲学家进餐问题

1、利用记录型信号量解决哲学家就餐问题会导致死锁

若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量 chopstick 均为 0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即可能会引起死锁。


// 哲学家线程函数,参数I是哲学家的编号
void philosopher(int I) 
{ 
    // 无限循环,模拟哲学家的一生
    while (true) 
    { 
        // 哲学家正在思考
        思考; 
        // 尝试拿起左边的筷子,如果筷子不可用,则等待
        wait (chopstick [ I ]); 
        // 尝试拿起右边的筷子,如果筷子不可用,则等待
        // 这里使用了取模运算,确保哲学家数组的索引不会越界
        wait (chopstick [(I+1)%5]); 
        // 拿起两只筷子后,开始进餐
        进餐; 
        // 进餐完毕,释放左边的筷子
        signal (chopstick [I]); 
        // 释放右边的筷子
        signal (chopstick [(I+1)%5]); 
    } 
}

在以上描述中,当哲学家饥饿时,总是先去拿他左边的筷子,即执行 ait(cho ti ck[i]);成功后,再去拿他右边的筷子,即执行 ait(cho ti ck[(i+ l)%5]); 又成功后便可进餐。进餐毕,又先放下他左边的筷子,然后再放他右边的筷子。虽然,上述解法可保证不会有两个相邻的哲学家同时进餐,但却有可能引起死锁。假如五位哲学家同时饥饿而各自拿起左边的筷子时,就会使五个信号量 cho ti ck 均为 0: 当他们再试图去拿右边的筷子时,都将因无筷子可拿而无限期地等待。

2、解决办法

(1)规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而偶数号哲学家则相反。按此规定,将是1,2号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

律己杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值