Реализация "Задачи об обедающих философах" на корутинах

Проект -- учебная задача для знакомства с работой корутин на Котлине.

Исходную формулировку задачи об обедающих философах и подходы к решению см. здесь.

Прежде чем приступить к решению основной задачи, предлагается ознакомиться с исходным кодом, разобраться в применении корутин в нём, оценить разницу между ConcurrentFork и AtomicFork и понять логику работы SampleKilosopher (этот класс реализует наивный алгоритм работы философа).

Формулировка основной задачи:

  1. Предложить свою реализацию философа (класс должен реализовывать AbstractKilosopher), позволяющую избежать дедлоков и прочих проблем с синхронизацией (можно использовать один из рассмотренных в статье Википедии подходов к решению). В этом пункте не разрешается менять базовые классы проекта, за исключением случая обнаружения в них багов.
  2. Реализовать расширенную задачу об обедающих философах. Пусть в середине стола лежит стопка салфеток, и философу, чтобы он мог есть, помимо двух вилок, требуется ещё и салфетка. Поэтому он перед началом еды берёт салфетку из стопки, а по окончании еды возвращает её в стопку. Количество салфеток в стопке -- настраиваемый параметр, его значение должно быть меньше половины числа философов за столом.
  3. Доработать свою реализацию философа и убедиться, что она функционирует верно и для расширенной задачи.

Решения всех частей задания можно присылать в виде:

  • Pull Request-ов к проекту (имейте в виду, что в этом случае решение видно остальным участникам проекта)
  • в виде файла / архива по электронной почте glukhikh@mail.ru (в этом случае решение видно только владельцу репозитория)

При обнаружении багов (а такое может случиться), о них можно сообщать в https://github.com/mglukhikh/kilosophers/issues и/или предлагать исправления в виде Pull Request-ов к проекту.