【问题标题】:Representing concurrent elevators in a simulation using Erlang Message passing [closed]使用 Erlang 消息传递在模拟中表示并发电梯[关闭]
【发布时间】:2016-01-07 01:35:30
【问题描述】:

我知道这不是一个理想的问题,但我会尽力解释它:)

首先,我的任务是创建具有多部电梯的建筑物的模拟。

假设我的建筑物由 2 到 5 部电梯和任意数量的楼层组成。这里的目标是让“人”登上电梯并前往不同的楼层。

这里的重点是同时运行每个电梯。

我已经设法在 C++ 中为每个电梯使用一个线程来做到这一点。我正在努力做的是想一个简单的方法来使用 Erlang 中的消息传递来做到这一点。我不是要代码答案,而是要解释如何使用消息传递来解决此问题。我当然试图阅读有关该主题的信息,但这让我感到困惑。

到目前为止,我了解线程必须通过相互传递消息进行通信。非常感谢任何帮助澄清这方面的方法。这不是作业或任何评分,是我的知识练习。

最后一个问题: 如何使用消息传递(在 Erlang 中)对具有多个编程为独立运行的电梯进行建模。

【问题讨论】:

  • “C++ 中的[..],每个电梯都有一个线程。”在 Erlang 中,你也会这样做。这些线程是否相互通信?在 Erlang 中,您为此使用消息传递。
  • 是的,他们做到了。抱歉,我意识到,我只是在努力如何通过消息设计电梯的交互,这是一个有点陌生的概念,由于某种原因我无法完全理解
  • C++ 中的线程是如何通信的?
  • 试图在所述共享数据上锁定互斥锁的共享变量和函数调用。
  • 您无需维护共享状态,而是为每个进程赋予其自己的状态,如果发生任何变化,您将包含更新(和相关数据)的消息发送到所有相关进程。

标签: c++ concurrency erlang synchronization message-passing


【解决方案1】:

您无需维护共享状态,而是为每个进程赋予其自己的状态,如果发生任何变化,您将包含更新(和相关数据)的消息发送到所有相关进程

Daniel 所说的进程是 Erlang 进程,而不是线程。它们可能看起来像线程,但它们至少有相似之处......所以最好将它们称为进程。

当你设计 Erlang 解决方案时,你需要小心不要带着 C 思维定势。 Erlang 的重点在于它是一个不同的范式,虽然 Erlang 本身是用 C 实现的,因此你在 Erlang 中所做的一切最终都在 C 线程中运行,但重要的是要在很大程度上忘记这一点并改用 Erlang 范式。

在 C 中是一些需要管理的东西,当你不仔细观察它们时,它们会很棘手并且会咬你。 Erlang 进程非常棒,您可以根据所有意图和目的生成无限数量的进程,而且它们实际上不需要任何照顾。

正如 Daniel 所说,在您的电梯场景中,为每个电梯生成一个进程是一个合理的设计。使用 Erlang 需要考虑的一件事是,在这种情况下的数量并不重要,一旦你编写了一个模块来模拟你的电梯,你可以生成 2 到 5 个,或者 2 到 500 万个,然后你通常用 Erlang 发现它几乎没有什么区别。

我并不是说你不能设计一个损坏的实现,但老实说,一旦你习惯了 Erlang,你会发现它确实适合快速开发,没有通常的并行和并发陷阱。

随着您的电梯场景的推进,推进它的正确方法是了解 OTP,为您的电梯使用 gen_server 之类的东西,并使用主管动态(或不)从中生成它们。如果您的电梯发生故障,该过程将自动更换/重新启动。这类似于电梯发生故障(进程已终止;电梯不可用)并且维修工程师来修复它(进程重新启动;电梯再次可用)。当电梯发生故障时,电梯中的任何人会发生什么可能是一个更高级的话题,对此有一些可能的解决方案。

【讨论】:

  • 说得好,但也请将我的评论内容包含在答案中。评论是不稳定的,它们可以随时消失;)(即“发送更新消息”部分)。
  • 谢谢大家!大帮助! :)
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2021-05-28
  • 2016-04-30
  • 2011-10-18
  • 2011-01-29
相关资源
最近更新 更多