Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Я думаю, что лучший подход для моделирования его был бы a Fork
класс с методом как use()
это содержит ветвление (bool available = false
) и a release()
это выпускает его.
A Philosopher
класс с getFork(Fork)
и releaseFork(Fork)
это работает, содержание/выпуск объектного Ветвления (кажется мне, таймер был бы хорош в методе useFork()
таким образом, можно действительно чувствовать мертвую блокировку.
И для последнего a DinningTable
(или любое другое имя) класс, который создает экземпляры и делает журнал. Если Вы планируете использовать потоки, вот то, где необходимо реализовать поток для каждого Philosopher
совпадение для Fork
.
Как предложение, Вы могли реализовать a Plate
Класс, содержа количество спагетти, что Philosopher.useFork()
метод ниже в течение периода времени. Таким образом, Вы видите который Philosopher
приходит первым.
Я позволю реализациям для Вас, конечно, так как Ваша цель состоит в том, чтобы изучить C#..., по моему опыту, Вы лучше изучаете выполнение чего-то конкретного как эти классы ;) Кроме того, можно найти много реализаций на Google, если Вы хотите обмануть...
Я приглашаю Вас совместно использовать код после него. Это - большая Ссылка Исследования.
Надежда Это помогает Вам.