进程同步——哲学家就餐问题

文章讨论了一个经典的并发控制问题——哲学家就餐问题,描述了如何使用信号量机制来防止死锁,首先提出保证最多4个哲学家同时吃饭的方案,然后优化为避免相邻哲学家同时竞争的策略,最后引入AND型信号量以同时获取两支筷子,确保资源的协调使用。
摘要由CSDN通过智能技术生成

哲学家就餐问题

典型的互斥制约关系的进程同步问题。描述是:
        有五个哲学家在同一张圆桌上用餐与思考。圆桌上为每人配发了一只碗,但仅在他们的每个空隙中配发了一只筷子,也即只有五只筷子可用。要求他们交替进行用餐与思考。平时大家都在思考,当某个哲学家饥饿时会试图去取其左右两边离他最近的筷子。只有在拿到两只筷子时才能进餐,否则只能继续思考。进餐完毕,放下筷子开始思考。
在这里插入图片描述

分析:假设吃饭时先拿左手边的,再拿右手边的,那么有可能5个人同时拿起筷子,此时就造成了思索问题,那么我们保证最多4个人同时吃饭:

semaphore chopsticks[5] = {1,1,1,1,1};
semaphore num = 4; 

void philosopherDining(){
   int i = 0;
	while(true){
        //思考。。。。。
        wait(num);//保证最多4人同时吃饭
        
        wait(chopsticks[i]);//拿起右边的筷子
        wait(chopsticks[(i+1) % 5]);//拿起左边的筷子
        //就餐。。。。。
        signal(chopsticks[(i+1) % 5]);//放下左边的筷子
        signal(chopsticks[i]);//放下右边的筷子
        signal(num);
	}
}

        上述实现还有一个问题,就是5个人在同一刻都想吃饭的话,只有一个可以吃,但是最多是两个人可以吃的。我们可以让相邻的人先竞争一个筷子,如果没有抢到,就不要再竞争另一边了,即:奇数先拿左边,偶数先拿右边

semaphore chopsticks[5] = {1,1,1,1,1};

void philosopherDining(){
   int i = 0;
	while(true){
        //思考。。。
       if(i % 2 == 0){
           wait(chopsticks[i]);//拿起右边的筷子
           wait(chopsticks[(i+1) % 5]);//拿起左边的筷子 
        }else{
           wait(chopsticks[(i+1) % 5]);//拿起左边的筷子
           wait(chopsticks[i]);//拿起右边的筷子
        }
        //就餐。。。。。
        signal(chopsticks[(i+1) % 5]);//放下左边的筷子
        signal(chopsticks[i]);//放下右边的筷子
	}
}

用AND型信号量解决:同时竞争两个筷子

int chopsticks[5] = {1,1,1,1,1};

void philosopherDining(){
   int i = 0;
	while(true){
        //思考。。。
      	Swait(chopsticks[i],chopsticks[(i+1) % 5 );
        //就餐。。。。。
       Ssignal(chopsticks[i],chopsticks[(i+1) % 5 );
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值