Как начать кодирование симуляции "Обедающие философы"? - PullRequest
6 голосов
/ 06 сентября 2008

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

1 Ответ

6 голосов
/ 06 сентября 2008

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

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

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

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

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

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

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

...