高端品牌网站建设网站开发注意什么,西安高新网站制作,网站做进一步优化,网站设计师待遇问题
有五个哲学家围坐在一圆桌旁#xff0c;桌中央有一盘通心粉#xff0c;每人面前有一只空盘子#xff0c;每两人之间放一只筷子。每个哲学家的行为是思考#xff0c;感到饥饿#xff0c;然后吃通心粉。为了吃通心粉#xff0c;每个哲学家必须拿到两只筷子#xff0…问题
有五个哲学家围坐在一圆桌旁桌中央有一盘通心粉每人面前有一只空盘子每两人之间放一只筷子。每个哲学家的行为是思考感到饥饿然后吃通心粉。为了吃通心粉每个哲学家必须拿到两只筷子并且每个人只能直接从自己的左边或右边去取筷子。 一个简单的解法是用一个信号量表示一支筷子这五个信号量构成信号量数组所有信号量初始值为1第I个哲学家的活动课描述为
semaphore chopstick[0…4] {1,1,1,1,1};
Repeatthink;wait(chopstick[i]);wait(chopstick[(i1) mod 5]);eat;signal(chopstick[i]);signal(chopstick[(i1) mod 5]);
until false;
若五位哲学家同时饥饿而各自拿起了左边的筷子这使五个信号量 chopstick 均为 0当他们试图去拿起右边的筷子时都将因无筷子而无限期地等待下去即可能会引起死锁。为防止死锁发生哲学家进餐问题的改进解法 方法一至多只允许四位哲学家同时去拿左筷子最终能保证至少有一位哲学家能进餐并在用完后释放两只筷子供他人使用。 方法二仅当哲学家的左右手筷子都拿起时才允许进餐。 方法三规定奇数号哲学家先拿左筷子再拿右筷子而偶数号哲学家相反。 请用PV操作描述上述三种方法。
解决方法
方法一
至多只允许四位哲学家同时去拿左筷子最终能保证至少有一位哲学家能进餐并在用完后释放两只筷子供他人使用
int chopstick[5] {1, 1, 1, 1, 1};
int man 4; //最多4个人可以拿左筷子
Philosopher( int i ) { //第i个哲学家while( true ) {think();wait( man ); //拿左筷子的哲学家不超过4个wait( chopstick[i] );wait( chopstick[ (i1)%5 ] );eat();signal( chopstick[i] );signal( chopstick[(i1)%5] );signal( man );}
}方法二
仅当哲学家的左右手筷子都拿起时才允许进餐否则将拿起的筷子放下
1为便于理解2先使用AND型信号量int chopstick[5] {1, 1, 1, 1, 1};
Philosopher( int i ) {while( true ) {think();Swait( chopstick[i], chopstick[(i1)%5] );eat();Ssignal( chopstick[i], chopstick[(i1)%5] );}
}(2) 使用PV操作// 使用加锁方式将取左右筷子的过程绑定为原子操作
int chopstick[5] {1, 1, 1, 1, 1};
int muitex 1;
Philosopher( int i ) {while( true ) {think();wait( mutex );wait( chopstick[i] );wait( chopstick[(i1)%5] );signal( mutex );eat();signal( chopstick[i] );signal( chopstick[(i1)%5] );}
}方法三
规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则相反
int chopstick[5] {1, 1, 1, 1, 1};
Philosopher( int i ) {while( true ) {think();if( i % 2 ) { //奇数号哲学家wait( chopstick[i] );wait( chopstick[(i1)%5] );} else { //偶数号哲学家wait( chopstick[(i1)%5] );wait( chopstick[i] );}eat();signal( chopstick[i] );signal( chopstick[(i1)%5] );}
}