经典进程的同步问题

版权声明:版权归游吟焰火所有,未经允许不得转载。 https://blog.csdn.net/chenzhanqi/article/details/82960846

问题描述:

五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。

问题分析:

放在桌子上的筷子时临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。

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

每个哲学家先拿他左侧的筷子,即执行wait(chopstick[i]);成功后再拿他右侧的筷子,即执行wait(chopstick[(i+1)%5];便可成功进餐。问题是当五个哲学家都拿完左侧筷子后,五个信号量都为0,再试图去拿右侧的筷子时,都会因无筷子可拿而陷入无限的等待,发生死锁状况。

可用的解决方法:

  1. 至多只允许有四位哲学家同时去拿左侧的筷子,最终能保证至少有一位哲学家能够进餐,并在用完餐后释放左右两支筷子。
  2. 仅当哲学家的左、右两支筷子都可用时,才允许他拿起筷子进餐。
  3. 规定奇数号哲学家先拿他左侧的筷子,然后再拿右侧的筷子;而偶数号哲学家则相反。即:1、2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。五位哲学家都先竞争奇数号筷子,获得后再去竞争偶数号筷子。
  4. 使用AND型信号量:第i位哲学家的活动:
do{
    ...
    //think
    ...
    Swait(chapstick[(i+1)%5],chapstick[i]);    //同时申请左右两侧的筷子
    ...
    //eat
    ...
    Signal(chapstick[(i+1)%5],chopstick[i]);   //同时释放
}while[TRUE];

猜你喜欢

转载自blog.csdn.net/chenzhanqi/article/details/82960846