2016-03-03 88 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并吃。