操作系统实验题,我是真的不会了,请教各位大神
如题:在Windows环境下,使用C++/C语言和记录型信号量实现以下进程同步互斥问题:有4位哲学家围坐在一张圆桌边,每位哲学家交替地就餐和思考。在圆桌中心有2个碗,每两位哲学家之间有1 根筷子。每位哲学家必须拿到一个碗和两侧的筷子之后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。
哲学家就餐这种问题,设计一套合理的就餐顺序,然后严格按照这个顺序执行就可以。
每一个餐具,就用一把锁代替。
每一个哲学家需要两根筷子,就意味着,需要同时持有两把锁。
因此,就需要避免死锁。比如,假设所有人围城一个近似为圆的形状,可以按照顺时针或者逆时针的方向加锁。
进一步,假设哲学家1,2两个人的位置关系为
筷子1,哲学家1,筷子2,哲学家2,筷子3
按照时间顺序发生了
1. 哲学家2 拿起筷子2 (成功)
2. 哲学家2 拿起筷子3 (成功)
3. 哲学家1 拿起筷子1 (成功)
4. 哲学家1 拿起筷子2 (失败),因为筷子2被哲学家2持有着。
此时,哲学家1,应该放弃对筷子1的持有(在代码中就是 while 循环不断重试 ),否则就会造成循环等待,死锁。 赚小钱 发表于 2020-6-17 21:52
哲学家就餐这种问题,设计一套合理的就餐顺序,然后严格按照这个顺序执行就可以。
每一个餐具,就用一把 ...
忘记说碗了。
与筷子一样,每一个碗,都可以被抽象为一把锁资源。
在加锁的时候,需要保证,要么先获取碗,后获取筷子;或者,要么先获取筷子,后获取碗。
否则,一旦加锁的顺序不固定,同样会死锁。
在使用完所有锁之后,释放锁的顺序,一般情况,应该与加锁的顺序相反(虽然顺序一致,在某些情况可能没问题)。 赚小钱 发表于 2020-6-17 21:57
忘记说碗了。
与筷子一样,每一个碗,都可以被抽象为一把锁资源。
在加锁的时候,需要保证,要么先获取 ...
大佬能帮忙看看我的题吗{:5_92:} linkz 发表于 2020-6-18 04:52
大佬能帮忙看看我的题吗
上面说的不就是你的题吗
页:
[1]