erlang和餐饮哲学家的并发[重复]
Posted
技术标签:
【中文标题】erlang和餐饮哲学家的并发[重复]【英文标题】:Concurrency in erlang and dining philosphers [duplicate] 【发布时间】:2016-06-17 08:41:13 【问题描述】:我正在处理哲学家就餐算法。我需要使用此代码生成 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】:来自***:
每个哲学家都被要求表现如下:
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.
所以每个哲学家都需要检查他的左叉是否可用,如果是,将其标记为不可用,可能通过向叉发送消息,然后继续下一个阶段——检查右叉。 如果叉子不可用,那么他需要思考(睡觉,然后再次检查)。
如果他能找到正确的叉子,他就可以开始进食,持续一段固定的时间。
那么我们对每个哲学家都有什么?
等待左叉 - 一个尝试拿起左叉的函数,如果成功则进入下一阶段,如果没有,请重复。
Wait for right fork - 一个尝试拾取右叉的函数,如果成功则进入下一阶段,如果没有,请重复。
Eat - 等待固定时间然后释放两个叉子并重复的函数。叉子需要管理谁能捡起它,所以没有两个哲学家会一起使用同一个叉子。所以它需要一个免费和释放功能。
更好的方法可能是使用 gen_fsm。分叉将有两种状态 - 可用或不可用,哲学家将有 wait_for_left_fork、wait_for_right_fork 和吃。
【讨论】:
以上是关于erlang和餐饮哲学家的并发[重复]的主要内容,如果未能解决你的问题,请参考以下文章