哲学家就餐问题

这是我参与18月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

1.问题描述
五个哲学家围在一个圆桌,分别坐在圆桌的5个凳子上,圆桌上有5个碗5支筷子,他们就是思考和进餐交替进行,当哲学家饥饿时便试图去取左右最靠近他的筷子,只有他在拿到两个筷子才能进餐,进餐完毕又放下筷子继续思考。

2.分析
5个哲学家 只有5支筷子,而

  • 方法一
1
2
3
4
5
6
scss复制代码semaphore chopstick[5] = {1,1,1,1,1}; //5支筷子都是互斥信号量
p(chopstick[i]); //拿起左边的筷子
p(chopstick[i+1]%5); //拿起右边的筷子
吃饭。。。
v(chopstick[i]); //放下筷子
v(chopstick[i+1]%5);

假设我们5个哲学家都拿起了左边的筷子,而都在等待起右边的筷子,这样就会造成死锁。

  • 方法二
    既然5个人拿筷子吃饭 可能会造成死锁 拿就让四个人拿筷子,就可以打破这种死锁 所以我们增加一个信号量eat
1
2
3
4
5
6
7
8
9
scss复制代码semaphore chopstick[5] = {1,1,1,1,1}; //5支筷子都是互斥信号量
semaphore eat = 4;
p(eat)
p(chopstick[i]); //拿起左边的筷子
p(chopstick[i+1]%5); //拿起右边的筷子
吃饭。。。
v(chopstick[i]); //放下筷子
v(chopstick[i+1]%5);
v(eat)
  • 方法三
    可以在人数上进行限制 那也可以限制哲学家 必须在左右筷子都可拿的情况下才能拿(意思就是要拿就俩只都拿 要一个不能拿就两只都不拿 这样我们就需要设置一个互斥信号量mutex=1)
1
2
3
4
5
6
7
8
9
ini复制代码semaphore chopstick[5] = {1,1,1,1,1};
semaphore mutex = 1;
p(mutex)
p(chopstick[i]); //拿起左边的筷子
p(chopstick[i+1]%5); //拿起右边的筷子
吃饭。。。
v(chopstick[i]); //放下筷子
v(chopstick[i+1]%5);
v(mutex)
  • 方法四
    就是基数号的哲学家与偶数号的哲学家拿筷子不一样,这样理解 我们假设当哲学家饥饿时,会先拿左边的筷子再拿右边的筷子,当5个哲学家饥饿时,都取拿左边的筷子就会造成死锁 就如方法一上面的情形,假设我们让基数号的先拿左边筷子再拿右边 偶数号的先拿右边再拿左边 刚好就可以避免这种死锁。(反正就是基偶号先拿筷子要对比 不能顺着拿)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
scss复制代码 semaphore chopstick[5] = {1,1,1,1,1}; //5支筷子都是互斥信号量
if(i mod 2 != 0){ //基数
p(chopstick[i]); //拿起左边的筷子
p(chopstick[i+1]%5); //拿起右边的筷子
吃饭。。。
v(chopstick[i]); //放下筷子
v(chopstick[i+1]%5);
}else{
p(chopstick[i+1]%5); //拿起右边的筷子
p(chopstick[i]); //拿起左边的筷子
吃饭。。。
v(chopstick[i]); //放下筷子
v(chopstick[i+1]%5);

}

方法二-方法是争对方法一会死锁提出的改进原则,但我们首先要知道哲学家进餐的核心操作是要拿到两双筷子才能进餐,这里是通过一个数组来表示筷子这个互斥信号量的

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%