admin 管理员组

文章数量: 1087652

哲学家就餐问题的三种避免死锁的解法(PV操作)

哲学家就餐问题的三种避免死锁的解法(PV操作)


方案一:最多允许有四位哲学家同时去拿左边的筷子,然后再拿右边的筷子,最终保证至少有一位哲学家能够进餐,并在就餐完毕时同时释放他用过的两只筷子,从而使更多的哲学家能够进餐

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量
semaphore count = 4;	//控制最多允许四位哲学家同时进餐void philosopher(int i){do {//thinking		//思考p(count);		//判断是否超过四人准备进餐P(mutex[i]);	//判断缓冲池中是否仍有空闲的缓冲区P(mutex[(i+1)%5]);//判断是否可以进入临界区(操作缓冲池)//...//eat			//进餐//...V(mutex[i]);//退出临界区,允许别的进程操作缓冲池V(mutex[(i+1)%5]);//缓冲池中非空的缓冲区数量加1,可以唤醒等待的消费者进程V(count);//用餐完毕,别的哲学家可以开始进餐}while(true);
}

方案二:当哲学家的左,右两只筷子均可用时,才允许他拿起筷子进餐

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量void philosopher(int i){do {//thinking		//思考Swait(mutex[i], mutex[(i+1)%5]);//判断哲学家左边和右边的筷子是否同时可用//...//eat		//...Ssignal(mutex[i], mutex[(i+1)%5]);//进餐完毕,释放哲学家占有的筷子}while(true);
}

方案三:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则先拿起他右边的筷子,然后再去拿他左边的筷子,此时需要在代码中添加个判断,来决定获取左、右筷子的顺序

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量void philosopher(int i){do {//thinking	if(i%2 == 1){P(mutex[i]);//判断哲学家左边的筷子是否可用P(mutex[(i+1)%5]);//判断哲学家右边的筷子是否可用}else{P(mutex[(i+1)%5]);//判断哲学家右边的筷子是否可用P(mutex[i]);//判断哲学家左边的筷子是否可用}//...//eat//...V(mutex[i]);//退出临界区,允许别的进程操作缓冲池V(mutex[(i+1)%5]);//缓冲池中非空的缓冲区数量加1,可以唤醒等待的消费者进程}while(true);
}

本文标签: 哲学家就餐问题的三种避免死锁的解法(PV操作)