0

我正在处理哲学家就餐算法。我需要使用此代码生成 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, []).

有人可以给我一个关于哲学家和叉子函数的粗略概念吗?

4

1 回答 1

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 和吃。

于 2016-03-04T10:57:16.560 回答