筷子

无聊的哲学家进餐问题

不问归期 提交于 2020-01-10 05:47:57
1 描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。 2 分析 1) 关系分析。 5名哲学家与左右邻居对其中间筷子的访问是互斥关系。 2) 整理思路。 显然这里有五个进程。本题的关键是如何让一个哲学家拿到左右两个筷子而不造成死锁或者饥饿现象。那么解决方法有两个,一个是让他们同时拿两个筷子;二是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生。 3) 信号量设置。 定义互斥信号量数组Ch0PstiCk[5] = {l, 1, 1, 1, 1}用于对5个筷子的互斥访问。对哲学家按顺序从0~4编号,哲学家i左边的筷子的编号为i,哲学家右边的筷子的编号为(i+l)%5。 semaphore chopstick[5] = {1,1,1,1,1}; //定义信号量数组chopstick[5],并初始化 Pi(){ //i号哲学家的进程 while(1){ P(chopstick[i]); //取左边筷子 P(chopstick[(i+1)%5]); //取右边篌子 eat; V

Java并发编程之Object.wait()/notify()

只谈情不闲聊 提交于 2019-12-15 13:32:38
场景: 1 双筷子,1 个或者多个人,餐桌每次只能一个人上去吃饭,其他人等待餐桌上的人吃完才有机会上去吃 。餐桌上吃完的那个人必须通知在等待吃饭的人说自己吃完了,你们可以吃了,此时在等待的人收到这个信号后,通过争抢的方式看谁先抢到筷子谁就能上餐桌吃饭,其他人继续等待 ; 在并发机制中,相当于线程的并发问题,该问题的关键在于怎么实现 等待与通知 的调度机制 ? 来源: CSDN 作者: AwayFuture 链接: https://blog.csdn.net/AwayFuture/article/details/103546499

哲学家进餐问题三种解决死锁问题

匿名 (未验证) 提交于 2019-12-03 00:05:01
方案一 至多允许有四位哲学家同时去拿左边的筷子,然后在允许拿右边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能同时释放他用过的两只筷子,从而使更多的哲学家能够进餐 方案二 仅当哲学家的左,右两只筷子均可用时,才允许他拿起筷子进餐 方案三 规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则先拿起他右边的筷子,然后再去拿他左边的筷子。按此规定,将是1、2号哲学家竞争1号筷子,3、4号哲学家竞争3号筷子。即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐 来源:51CTO 作者: AYXYJ 链接:https://blog.csdn.net/weixin_39531549/article/details/100857716

操作系统经典进程同步问题之生产者-消费者问题

匿名 (未验证) 提交于 2019-12-02 23:36:01
版权声明:原创文章,可以转载 https://blog.csdn.net/qq_43390235/article/details/90645029 操作系统经典进程同步问题之 哲学家进餐问题 哲学家进餐问题 1.问题描述:有五位哲学家,它们的生活方式是交替的进行思考和进餐。哲学家门共用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有五只碗和五根筷子,平时哲学家进行思考,饥饿的时候视图取其左右的靠他最近的筷子,只有当拿到两根筷子时才能进餐。 2.利用记录型信号解决哲学家进餐问题 chopstick:筷子是临界资源所以设置筷子为信号 量,又因为有5只筷子所以定义信号量数组,切互斥所以初始值设置为1,此外哲学家(进程)对筷子的操作相同。 semaphore chopstick[5]={1,1,1,1,1}; do{ wait(chopstick[i]); //使用第i只筷子 wait(chopstick[(i+1)%5]); //使用第i+1只筷子 //eat signal(chopstick[i]); //释放第i只筷子 signal(chopstick[(i+1)%5]); //释放第i+1只筷子 //think ... }while(TRUE); 存在的问题:当哲学家都成功的拿起左边的筷子时都处于“等待”状态,进而发生死锁的问题。 3.解决策略: 1