进程同步——哲学家进餐问题

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

问题分析:

筷子是临界资源,一次只能被一个哲学家使用。因此,五个人不能同时拿起左边的筷子(或右边)否则或引起死锁。

解决方案:

(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]);
    }
}

                                                                                                                                                                                             

猜你喜欢

转载自www.cnblogs.com/zhai1997/p/12001244.html