2016-03-03 85 views
0

我正在處理哲學家的餐飲算法。我需要生成5個哲學家,我已經這樣做了使用此代碼erlang和餐飲哲學家的併發

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. 

所以每個哲學家需要檢查,如果他的左叉是可用的,如果是,將其標記因爲不可用,也許通過向叉子發送消息,並繼續到下一個階段 - 檢查正確的叉子。 如果叉子不可用,那麼他需要思考(睡覺,然後再次檢查)。

如果他設法弄到正確的叉子,他可以開始吃一段固定的時間。

那麼,我們對每個哲學家有什麼?

  • 等待左叉 - 試圖拿起左叉,如果能做到這樣去下一個階段,如果沒有,重複的功能。

  • 等待右分叉 - 試圖拾取右分叉的功能,如果設法這樣做,則轉到下一個階段,如果沒有,則重複。

  • 吃 - 一個功能,等待一段固定的時間,然後釋放叉和重複。

叉需要管理誰可以拿起它,所以沒有兩個哲學家會一起使用同一個叉。所以它需要一個免費和釋放功能。

更好的方法來做到這一點可能與gen_fsm。叉子將有兩個狀態 - 可用或不可用,哲學家將有wait_for_left_fork,wait_for_right_fork並吃。