IPC之哲学家进餐问题

A问题:

  1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。

   “五个哲学家围坐在一张圆桌周围,每个哲学家的前面都有一份通心面,由于面条很滑,必须使用2把叉子才能夹住。相邻2份通心面之间有1把叉子。哲学家的生活包括:吃饭、思考。当哲学家感觉饿了,他就试图分2次取他左右的叉子,每次拿1把,但不分次序。如果成功获得2把叉子,则开始吃饭,吃完放下叉子继续思考。”

  问题要求不能死锁。

A解决:

  

#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 0
#define EATING 2
typedef int semaphore;
int state[N];
semaphore mutex=1;
semaphore s[N];
void philosopher(int i)
{
    while(TRUE)
    {
        think();
        take_forks(i);
        eat();
        put_forks(i);  
    }
}

void take_forks(int i)
{
    down(&mutex);
    state[i] = HUNGRY;
    test(i);
    up(&mutex);
    down(&s[i]);
}

void put_forks(int i)
{
    down(&mutex);
    state[i] = THINKING;
    test(LEFT);
    test(RIGHT);
    up(&mutex);
}

void test(i)
{
    if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT != EATING])
    {
        up(&s[i]);
    }

}

 

访问哲学家状态数组时进行互斥

当前哲学家饿了,且左右哲学家都没有进餐时,设置信号量。

之后根据信号量(是否设置过)进行确定是否阻塞。

 

转载于:https://www.cnblogs.com/pokerface/p/8901772.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值