- Работа с узлами
У нас есть N философов, обедающих за круглым столом (В нашем случае 5). Перед каждым философом стоит миска спагетти. Между каждой парой соседних философов ставится вилка. Как следствие, у каждого философа есть вилка слева и справа.
Каждый философ поочередно будет есть и думать. Для принятия пищи философу необходимо взять в руки обе вилки (с левой и с правой стороны). Одну вилку не могут использовать одновременно два философа; это значит, что когда философ ест, соседние философы должны думать. После еды каждый философ должен положить вилки, чтобы они могли быть доступны другим философам (включая себя). Если философ пытается есть и у него берут вилку, он должен вернуться к размышлениям.
Проблема состоит в том, чтобы разработать параллельный алгоритм, который заставит философов поочередно есть и думать, следуя вышеуказанным ограничениям, без тупиков и без голодания.
Для решения задания использовался язык Scala и сервис Zooekeeper, в данной реализации каждый философ является отдельным процессом в системе.
Результат работы программы выводится в консоль:
Существует два вида потоков Coordinator и Worker (Они располагаются в соответствующих файлах) В системе управления транзакциями Coordinator создает временный узел и ждет, пока Worker создадут свои узлы и проголосуют. Worker создают временные узлы как дочерние узлы узла Coordinator, и значение узла (commit или abort) устанавливается случайным образом. После получения голосов Coordinator принимает решение на основе относительного большинства и отправляет его дочерним узлам. в данной реализации каждый регистр является отдельным процессом в системе