哲学家进餐问题:有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们共用一张园桌,分别坐在周围五张椅子上。在圆桌上五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进程毕,放下筷子又继续思考。
问题分析:
筷子是临界资源,一次只能被一个哲学家使用。因此,五个人不能同时拿起左边的筷子(或右边)否则或引起死锁。
解决方案:
(1)至多只允许四位哲学家同时拿左边的筷子,最终保证有一位哲学家能够进餐,并且用完能够释放筷子,让更多的哲学家进餐。
(2)仅当哲学家左右两只筷子都可以用的时候,才允许拿筷子进餐。
semaphore chopstick[5]={1,1,1,1,1};//五个信号量,一个信号量代表一只筷子 semaphore mutex=1; Pi(){ while(1){ wait(mutex);//设置信号量,防止其它人争夺资源 wait(chopstick[i]); wait(chopstick[(i+1)%5]); signal(mutex);//拿到两只筷子后释放信号量 吃饭; signal(chopstick[i]);//吃过饭后,释放筷子资源 signal(chopstick[(i+1)%5]); } }
(3)奇数号哲学家先拿左边的,再拿右边的;偶数则相反。即五位哲学家都先竞争奇数号筷子,获得后再去竞争偶数号筷子,最终总会有一位哲学家有两只筷子。
semaphore chopstick[5]={1,1,1,1,1}; Pi(){ while(1){ if(i%2!=0){//奇数号哲学家 wait(chopstick[i]);//拿左边的 wait(chopstick[(i+1)%5]);//右边的 }else{//偶数号哲学家 wait(chopstick[(i+1)%5]);//右边的 wait(chopstick[i]);//左边的 } 进餐; signal(chopstick[i]);//释放筷子资源 signal(chopstick[(i+1)%5]); } }