哲学家进餐问题-3中解决方案

本文探讨了哲学家进餐问题,分析了五个哲学家如何避免死锁和饥饿现象。提出了三种解决方案:1) 利用AND型信号量机制(未实际应用),2) 通过信号量保护实现原子操作,确保不发生死锁但效率较低,3) 规定奇偶哲学家取筷子顺序,避免饿死现象。
摘要由CSDN通过智能技术生成

问题描述

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图2-10所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、 右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

问题分析

1) 关系分析。5名哲学家与左右邻居对其中间筷子的访问是互斥关系。

2) 整理思路。显然这里有五个进程。本题的关键是如何让一个哲学家拿到左右两个筷子而不造成死锁或者饥饿现象。那么解决方法有两个,一个是让他们同时拿两个筷子;二是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生。



一共5个哲学家,编号0 ~4, 5支筷子编号也是0 ~4, 0号哲学家右手的筷子编号是0号,逆时针增加,哲学家的编号也是逆时针增加所以:
0号哲学家对应的是: 4号和1号筷子.
1号哲学家对应的是: 0号和2号筷子.
2号哲学家对应的是: 1号和3号筷子.
3号哲学家对应的是: 2号和4号筷子.
4号哲学家对应的是: 3号和0号筷子.
所以有宏定义:
#define left(phi_id) (phi_id+N-1)%N
#define right(phi_id) (phi_id+1)%N
N = 5

5支筷子对应5个互斥锁,所以:

pthread_mutex_t forks[N]={PTHREAD_MUTEX_INITIALIZER};

哲学家线程需要执行的动作是:

void take_forks(int id){
    //获取左右两边的筷子
    printf("Pil[%d], left[%d], right[%d]\n", id, left(id), right(id));
    pthread_mutex_lock(&forks[left(id)]);
    pthread_mutex_lock(&forks[right(id)]);
    //printf("philosopher[%d]  take_forks...\n", id);
}

void put_down_forks(int id){
    printf("philosopher[%d] is put_down_forks...\n", id);
    pthread_mutex_unlock(&forks[left(id)]);
    pthread_mutex_unlock(&forks[right(id)]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值