如何开始编写" Dining Philosophers"模拟的代码?
时间:2020-03-05 18:48:45 来源:igfitidea点击:
我不是C的初学者,但是我确实需要加深理解,因此我选择了一个经典的死锁问题来编写代码,以帮助自己学习一些C#的更高级概念。餐饮哲学家问题似乎是一个好问题,但我需要一点帮助才能开始。我知道我需要以"食客"为对象,但是为了模拟进餐之间的随机延迟,我是否应该将每个食客的线程都放在单独的线程中?我需要某种"主人"来监视所有动作吗?任何一般的设计概念建议都可以接受,但是我想做一个粗略的编程作为练习。谢谢!
解决方案
回答
我认为,模拟它的最佳方法是使用Fork类,该类具有可保存fork的use()这样的方法(布尔可用= false)和释放它的release()。
一个带有getFork(Fork)
和releaseFork(Fork)
的Philosopher
类,用于操作对象Fork的保持/释放(在我看来,计时器在useFork()方法中会很好,所以我们可以意识到僵局。
最后,一个DinningTable
(或者任何其他名称)类创建实例,并进行日志记录。如果我们打算使用线程,则应在此处为并发每个Fork的每个Philosopher实现一个线程。
作为建议,我们可以实现一个Plate
类,并保留一定数量的意大利面,而在该时间段内,这些意大利面的Philosopher.useFork()方法要低一些。这样,我们可以看到哪个"哲学家"首先完成。
当然,由于目标是学习C ...,因此我将为我们提供这些实现,根据我的经验,我们最好学习做类似这些类的具体操作;)此外,如果我们想在Google上找到很多实现,欺骗 ...
我邀请我们分享之后的代码。这是一个很好的学习参考。
希望对我们有帮助。