2016-03-03 6 views
0

Im, решающий алгоритм обеденных философов. Мне нужно, чтобы породить 5 философов, которые я сделал это, используя этот кодПараллельность в erlang и столовой philosphers

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 - функция, которая ждет фиксированного количества времени, а затем отпустите обе вилки и повторите.

Вилка должна управлять, кто может ее поднять, поэтому никакие два философа никогда не будут использовать одну и ту же вилку вместе. поэтому ему необходимо предоставить бесплатную и освобожденную функцию.

Лучший способ сделать это может быть с gen_fsm. У вилки будут два состояния - доступные или недоступные, а у философов будет wait_for_left_fork, wait_for_right_fork и есть.

Смежные вопросы