Параллелизм в эрланге и столовой философии
Я берусь за алгоритм столовых философов. Мне нужно породить 5 философов, которые я сделал, используя этот код
main() ->
philos1 = spawn (?MODULE, philosopher, []),
philos2 = spawn (?MODULE, philosopher, []),
philos3 = spawn (?MODULE, philosopher, []),
philos4 = spawn (?MODULE, philosopher, []),
philos5 = spawn (?MODULE, philosopher, []),
fork1 = spawn (?MODULE, fork, []),
fork2 = spawn (?MODULE, fork, []),
fork3 = spawn (?MODULE, fork, []),
fork4 = spawn (?MODULE, fork, []),
fork5 = spawn (?MODULE, fork, []).
Может ли кто-нибудь дать мне приблизительное представление о том, как будут выглядеть функции философа и форка?
1 ответ
Из Википедии:
каждому философу дано указание вести себя следующим образом:
think until the left fork is available; when it is, pick it up; think until the right fork is available; when it is, pick it up; when both forks are held, eat for a fixed amount of time; then, put the right fork down; then, put the left fork down; repeat from the beginning.
Таким образом, каждый философ должен проверить, доступен ли его левый форк, если он есть, пометить его как недоступный, возможно, отправив сообщение на форк, и перейти к следующему этапу - проверке правого форка. Если вилка недоступна, ему нужно подумать (спать, а потом снова проверять).
Если ему удастся получить правильную вилку, он может начать есть в течение определенного периода времени.
Итак, что мы имеем для каждого философа?
Ожидание левой развилки - функция, которая пытается поднять левую развилку и, если ей это удастся, перейти к следующему этапу, если нет, повторить.
Дождитесь правой развилки - функция, которая пытается подобрать правую развилку и, если ей это удастся, перейти к следующему этапу, если нет, повторить.
- Eat - функция, которая ждет фиксированное количество времени, а затем отпускает обе вилки и повторяется.
Вилка должна управлять тем, кто ее подберет, поэтому никакие два философа никогда не будут использовать одну и ту же вилку вместе. так что надо проставить функцию free и release.
Лучший способ сделать это может быть с gen_fsm. Вилка будет иметь два состояния - доступно или недоступно, и философы получат wait_for_left_fork, wait_for_right_fork и eat.