Как начать программировать симуляцию «Обедающие философы»?
Вопрос
Я не новичок в C#, но мне действительно нужно улучшить свое понимание, поэтому я выбрал для написания кода классическую проблему взаимоблокировки, чтобы освоить некоторые из более сложных концепций C#.А Проблема обедающих философов кажется хорошим, но мне нужна небольшая помощь, чтобы начать.Я знаю, что мне нужно относиться к «посетителям» как к объектам, но для имитации случайных задержек между приемами пищи, должен ли я рассмотреть возможность объединения каждого посетителя в отдельный поток?Нужен ли мне какой-то «мастер», чтобы следить за всеми действиями?Любые общие советы по концепции дизайна приветствуются, но я бы хотел выполнить черновое программирование в качестве упражнения.Спасибо!
Решение
Я думаю, что лучший подход для моделирования этого будет Fork
класс с таким методом, как use()
который держит вилку (bool available = false
) и release()
это освобождает его.
А Philosopher
класс с getFork(Fork)
и releaseFork(Fork)
который управляет удержанием/отпусканием объекта Fork (мне кажется, что таймер был бы хорош в методе useFork()
так что вы действительно можете почувствовать тупик.
И напоследок DinningTable
(или любое другое имя), который создает экземпляры и ведет журнал.Если вы планируете использовать потоки, здесь вам следует реализовать поток для каждого из них. Philosopher
соглашаясь на Fork
.
В качестве предложения вы можете реализовать Plate
Класс, держащий в руках такое количество спагетти, которое Philosopher.useFork()
метод ниже в течение периода времени.Таким образом, вы можете увидеть, какие Philosopher
финиширует первым.
Конечно, я оставлю реализации за вас, поскольку ваша цель — изучить C#...по моему опыту, вам лучше научиться делать что-то конкретное, например, эти классы;) Кроме того, вы можете найти в Google множество реализаций, если хотите схитрить...
Приглашаю вас поделиться кодом после него.Это отличный справочник по обучению.
Надеюсь, это вам поможет.