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操作)
版权声明:本文标题:哲学家就餐问题的三种避免死锁的解法(PV操作) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1686562056a10587.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论