问题背景
最近操作系统课上看见了哲学家饥饿问题,很感兴趣就在网上搜索了一下.
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