在erlang和餐厅philosphers的并发

时间:2016-03-03 20:10:51

标签: erlang dining-philosopher

我正在处理餐饮哲学家的算法。我需要使用此代码

产生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 个答案:

答案 0 :(得分: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和吃。