Как начать программировать симуляцию "Обеденные философы"?

Я не новичок в C#, но мне действительно нужно углубить свое понимание, поэтому я выбрал классическую проблему тупика для кода, чтобы научиться некоторым более продвинутым концепциям C#. Проблема обедающих философов кажется хорошим, но мне нужна небольшая помощь, чтобы начать. Я знаю, что мне нужно подходить к «посетителям» как к объектам, но для имитации случайных задержек между приемами пищи, следует ли мне обращаться к каждому посетителю в отдельном потоке? Нужен ли мне какой-то «хозяин», чтобы контролировать все действия? Любые общие советы по концепции дизайна приветствуются, но я хотел бы выполнить базовое программирование в качестве упражнения. Спасибо!

Хммм ... Я бы, вероятно, смоделировал "посетителей" как потоки ... хотя они могли быть объектами, оборачивающими потоки.

paxos1977 14.10.2008 01:36

Джейкоб, ты когда-нибудь решал задачу «Обеденные философы»? Я думаю решить эту проблему, используя 2 мьютексные переменные, поскольку одновременно могут есть только 2 философа.

AviFarah 08.04.2018 01:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
2
3 964
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что лучшим подходом к моделированию этого будет класс Fork с таким методом, как use(), который удерживает вилку (bool available = false), и release(), который ее освобождает.

Класс Philosopher с getFork(Fork) и releaseFork(Fork), который управляет удержанием / освобождением объекта Fork (мне кажется, таймер был бы хорош в методе useFork(), чтобы вы действительно могли почувствовать тупик.

А для Last - класс DinningTable (или любое другое имя), который создает экземпляры и ведет журнал. Если вы планируете использовать потоки, здесь вы должны реализовать поток для каждого Philosopher, совпадающий с Fork.

В качестве предложения вы можете реализовать класс Plate, содержащий количество спагетти, которое метод Philosopher.useFork() меньше в течение периода времени. Таким образом, вы сможете увидеть, какой Philosopher финиширует первым.

Я предоставлю вам реализации, конечно, поскольку ваша цель - изучить C# ... по моему опыту, вам лучше научиться делать что-то конкретное, например эти классы;) Кроме того, вы можете найти множество реализаций в Google, если хотите изменять ...

Я приглашаю вас поделиться кодом после него. Это отличное учебное пособие.

Надеюсь, это поможет вам.

Другие вопросы по теме